从整个 Html 中删除空格,但在 pre 中使用正则表达式
Posted
技术标签:
【中文标题】从整个 Html 中删除空格,但在 pre 中使用正则表达式【英文标题】:Remove white space from entire Html but inside pre with regular expressions 【发布时间】:2012-02-04 11:41:12 【问题描述】:在 ASP.NET MVC 3 上,我创建了一个动作过滤器,用于从整个 html 中删除空白。它大部分时间都像我预期的那样工作,但现在我需要更改正则表达式,以免触及 pre
元素内部。
我从很棒的Mads Kristensen 的博客中获得了 RegEx 逻辑,但我不知道如何为此修改它。
逻辑如下:
public override void Write(byte[] buffer, int offset, int count)
string HTML = Encoding.UTF8.GetString(buffer, offset, count);
Regex reg = new Regex(@"(?<=[^])\t2,|(?<=[>])\s2,(?=[<])|(?<=[>])\s2,11(?=[<])|(?=[\n])\s2,");
HTML = reg.Replace(HTML, string.Empty);
buffer = System.Text.Encoding.UTF8.GetBytes(HTML);
this.Base.Write(buffer, 0, buffer.Length);
过滤器的完整代码:
https://github.com/tugberkugurlu/MvcBloggy/blob/master/src/MvcBloggy.Web/Application/ActionFilters/RemoveWhitespacesAttribute.cs
有什么想法吗?
编辑:
重要提示:
我的意图完全不是加快响应时间。实际上, 也许这会减慢速度。我压缩了页面,这个缩小让我 每页增加大约 4 - 5 kb,这没什么。
【问题讨论】:
***.com/questions/1732348/… 每页 4 到 5 kb 是不是什么都没有! 这个正则表达式很糟糕,写它的人并不真正知道他们在做什么。 @tugberk,这是多余的,而且有些地方是错误的。删除第一个更改,删除第三个更改,删除所有[
和 ]
字符。您最终会得到一个等效的表达式,但更短、更快、更简洁。
只是出于兴趣,您为什么对每个请求都这样做?为什么不把内容发布到网站上呢?
【参考方案1】:
使用正则表达式解析 HTML 非常复杂,任何简单的解决方案都可能容易出错。 (使用正确的工具来完成这项工作。)话虽如此,我将展示一个简单的解决方案。
首先我简化了你必须的正则表达式:
(?<=\s)\s+
用空字符串替换这些匹配项以消除所有地方的双空格。
假设pre
标签内没有&lt;
或&gt;
,您可以在表达式末尾添加(?![^<>]*</pre>)
,使其在pre
标签内失败。这确保</pre>
不遵循当前匹配,中间没有任何标签。
导致:
(?<=\s)\s+(?![^<>]*</pre>)
【讨论】:
这符合我的预期,谢谢!我也明白这不是推荐的方式。 不幸的是,如果 pre 中有 ,这将失败,如果 pre 用于显示代码,这可能很常见。 @RobW,应该没有,你应该用&lt;
和&gt;
编码。【参考方案2】:
请参阅非常史诗般的RegEx match open tags except XHTML self-contained tags,了解正则表达式和 HTML 无法相处的所有原因。
如果您使用上述方法来缩小页面大小,那么您绝对应该考虑 IIS 压缩,因为大多数浏览器都可以利用它,而且它比您使用它的方式更容易。以下是在 IIS 6 和 IIS 7 中的操作方法:
http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/502ef631-3695-4616-b268-cbe7cf1351ce.mspx?mfr=true
http://technet.microsoft.com/en-us/library/cc771003(WS.10).aspx
【讨论】:
请阅读更新后的问题。我问了一件事,你回答了另一件事。 +1 @tugberk 你说“我不确定如何修改它(正则表达式)”,给定链接的答案是“不要那样做”。为正确的工作使用正确的工具,而正则表达式不是用来解析 Html 的工具。 不是有意发动圣战,抱歉让您觉得我浪费了您的时间。我会看看是否可以在单独的帖子中回答您更新后的问题。【参考方案3】:也许把它分成四个步骤:
-
使用正则表达式提取任何匹配的 PRE 元素,例如“
start with <pre>(anything not </pre>)* end with </pre>
”之类的简单内容
用单独的 GUID 替换每个匹配项,并保存 GUID 字典 -> pre element html。
去掉空格(不会影响 GUID 或其位置。
遍历您在 2. 中保存的字典,并将前置元素放回正确的位置。
【讨论】:
以上是关于从整个 Html 中删除空格,但在 pre 中使用正则表达式的主要内容,如果未能解决你的问题,请参考以下文章