在ASP.NET MVC 3上,我创建了一个动作过滤器,用于从整个html中删除空白区域。它的工作方式与我预期的大部分时间相同,但现在我需要更改RegEx以便不触及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(@"(?<=[^])\t{2,}|(?<=[>])\s{2,}(?=[<])|(?<=[>])\s{2,11}(?=[<])|(?=[\n])\s{2,}");
HTML = reg.Replace(HTML, string.Empty);
buffer = System.Text.Encoding.UTF8.GetBytes(HTML);
this.Base.Write(buffer, 0, buffer.Length);
}
过滤器的整个代码:
有什么想法吗?
修改
BIG注意:
我的意图完全不是加快响应时间。事实上, 也许这会让事情变慢。我GZiped页面,这种缩小使我 每页增加大约4 - 5 kb,这没什么。
答案 0 :(得分:5)
使用正则表达式解析HTML非常复杂,任何简单的解决方案都很容易破解。 (使用正确的工具进行工作。)话虽如此,我将展示一个简单的解决方案。
首先,我简化了你必须使用的正则表达式:
(?<=\s)\s+
用空字符串替换这些匹配,以便在任何地方摆脱双重空格。
假设<
标记内没有>
或pre
,您可以在表达式的末尾添加(?![^<>]*</pre>)
,使其在{{1}内失败标签。这可确保pre
不遵循当前匹配,中间没有任何标记。
导致:
</pre>
答案 1 :(得分:0)
请查看非常史诗RegEx match open tags except XHTML self-contained tags,了解正则表达式与HTML不相关的所有原因。
如果您正在使用上述方法来缩小页面大小,那么您绝对应该研究IIS压缩,因为大多数浏览器都可以利用它,并且它比您的方法更容易。以下是在IIS 6和IIS 7中执行此操作的方法:
http://technet.microsoft.com/en-us/library/cc771003(WS.10).aspx
答案 2 :(得分:0)
也许将其分解为四个步骤:
start with <pre>(anything not </pre>)* end with </pre>
”