正则表达式替换 HTML 文档中的空格

Posted

技术标签:

【中文标题】正则表达式替换 HTML 文档中的空格【英文标题】:Regex replace whitespace in HTML document 【发布时间】: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 时将其删除,无论如何都不会为你节省任何可衡量的数量。 【参考方案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, ***.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);

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

【讨论】:

以上是关于正则表达式替换 HTML 文档中的空格的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式替换以删除 html 标记之间的空格

php正则表达怎么把一个字符串中的所有空格都转化为下划线

用于模式替换的 Java 正则表达式 - 特殊字符和大小写更改为空格

js正则表达式替换HTML标签以及空格(&nbsp;)

使用正则表达式替换字符串中的特定字母

使用正则表达式c#替换文档中的文本字段