1

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

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

谢谢你。

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

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

4

6 回答 6

1

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

于 2012-10-15T13:38:46.233 回答
1

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

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

于 2012-10-15T13:47:28.500 回答
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 或文本区域内的空格,但会删除文本节点中的换行符。

于 2012-10-15T13:48:22.737 回答
0
Regex.Replace(document.body.innerHTML, @"\s+", "");

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

于 2012-10-15T13:40:15.147 回答
0

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

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

于 2012-10-15T13:41:22.690 回答
0
Regex.Replace(html, "\s*(<[^>]+>)\s*", "$1", RegexOptions.SingleLine);

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

于 2012-10-15T16:40:54.793 回答