【问题标题】:Regex replace whitespace in HTML document正则表达式替换 HTML 文档中的空格
【发布时间】:2012-10-15 13:37:09
【问题描述】:

我看到很多类似的问题,但仍然没有找到答案。
应该如何看待需要替换 HTML 中的所有空格(包括换行符)但忽略标签的正则表达式?

目前我使用Regex.Replace(content, @"\s+", "");,但会删除页面上存在的 JavaScript 中的空格,然后页面不起作用。

谢谢。

编辑:在回答一些问题后,这里有更多细节: 我正在做的是“缩小”我们网站上的 HTML 输出的 HTTP 模块。我们有一个网站,其中包含来自许多不同来源的非常动态的内容。最终目标是减小页面大小并减少网络流量。这是一个高负载的网站,所以完成它对我们很重要。

实际上我们正在使用 MbCompression 库进行 JS 和 CSS 缩小,但它不支持缩小 HTML 输出(至少我没有找到)。

【问题讨论】:

  • 你问的是 JavaScript 还是 C#?
  • 看看here,一个著名的SO问题
  • 为什么不改为GZIP
  • @jrummell 我们正在使用,但我们在压缩之前删除了空格,此外并不总是支持压缩。
  • 在压缩之前删除多余的空白可以节省很少的钱。最好根本不生成它,但是当你继续使用 gzip 时将其删除,无论如何都不会为你节省任何可衡量的数量。

标签: javascript asp.net html regex


【解决方案1】:

如果你能找到一个不错的 HTML 解析器,我会通过 DOM 操作来实现。如果你不能,那么就像

Regex.Replace(content, "(?i)(<script(?:[^>\"']|\"[^\"]*\"]|'[^']*')*>)\s+</script\\s*>|<style(?:[^>\"']|\"[^\"]*\"]|'[^']*')*>)\s+</style\\s*>|<textarea(?:[^>\"']|\"[^\"]*\"]|'[^']*')*>)\s+</textarea\\s*>|</?[a-z](?:[^>\"']|\"[^\"]*\"]|'[^']*')*>|\\S+)|\\s+", "$1");

应该这样做。它不会删除标签内或嵌入的 JS、CSS 或文本区域内的空格,但会删除文本节点中的换行符。

【讨论】:

  • 正如我现在所想的,我们也使用来自 AgilityPack 的 HtmlDocument。你知道它是否支持这样的选项吗?
  • @AlexDn, stackoverflow.com/questions/846994/how-to-use-html-agility-pack 建议htmlDoc.DocumentNode.SelectSingleNode("//body") 将获取正文,然后您可以遍历它以查找不在&lt;script&gt; 元素等内的所有文本节点,并省略白色-随心所欲的空间。
  • 好的,谢谢,看来我将使用 HtmlDocument traverse 的解决方案。
【解决方案2】:

真的没有办法编写一个(合理的)正则表达式来做到这一点。如果您想支持 javascript 和 css,尤其如此。你需要一个真正的解析器。

【讨论】:

  • 你能建议任何可以做到这一点的解析器吗?
  • htmlagilitypack.codeplex.com 也许?将 HTML 解析为 DOM 树,然后在 textnodes 上进行空白修剪。
【解决方案3】:

你的目标是什么?浏览器在渲染页面时会忽略很多空白,所以我猜你想清理你的源代码。如果是这样,请检查您使用的程序是否提供了一些解决方案。例如,Dreamweaver 有一个重新格式化源代码的工具。

Tidy 可能是一种选择,但它看起来不仅仅是一个简单的代码格式化工具。

【讨论】:

    【解决方案4】:

    当然,您至少应该用空格替换它,而不仅仅是完全删除空格。对于应该没问题的 HTML,但是如果您正在谈论在 javascript 中使用多个空格不折叠的字符串,那么您需要考虑另一种方法,因为无论您是在脚本中还是在字符串中,正则表达式都不会轻易解决.

    话虽如此,我不确定这样做的充分理由。如果您担心文件的大小,那么只需告诉您的服务器使用压缩,我怀疑现在每个浏览器都支持得足够好,并且页面基本上将由服务器压缩并在客户端解压缩。它对服务器的工作量更大,因此取决于您是否更关心带宽或 CPU。

    【讨论】:

      【解决方案5】:
      Regex.Replace(document.body.innerHTML, @"\s+", "");
      

      使用document.body.innerHTML 可能会起作用。我不确定。

      【讨论】:

      • 我在 C#(服务器端)中需要它
      【解决方案6】:
      Regex.Replace(html, "\s*(<[^>]+>)\s*", "$1", RegexOptions.SingleLine);
      

      存在与标签、未封闭标签等相关的风险。我希望您对您所说的“来自不同来源的动态内容”有所控制。我也希望你已经尝试了其他所有方法,这是最后的手段。

      【讨论】:

        猜你喜欢
        • 2011-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-12
        • 1970-01-01
        • 2018-09-19
        • 2021-12-18
        • 2014-10-01
        相关资源
        最近更新 更多