从整个Html中删除空白空间,但内部预先使用正则表达式
在ASP.NET MVC 3上,我创建了一个用于从整个html中删除空白空间的Action Filter。它的工作原理与我预期的大部分时间一样,但现在我需要更改RegEx以便不触及pre
元素。从整个Html中删除空白空间,但内部预先使用正则表达式
我从真棒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,这是什么。
解析HTML与正则表达式很复杂,任何简单的解决方案可能容易折断(使用正确的工具的工作。)话虽这么说,我会告诉一个简单的解决方案
首先我简单,你必须在正则表达式:。
(?<=\s)\s+
用空字符串替换这些匹配以摆脱任何地方的双空格。
假设有在pre
标签内没有<
或>
,你可以在表达式的末尾添加(?![^<>]*</pre>)
使其失效的pre
标签内。这确保</pre>
不会跟随当前匹配,没有任何标签之间。
在所得:
(?<=\s)\s+(?![^<>]*</pre>)
由于所有正则表达式和HTML不相处的原因,请参阅非常史诗RegEx match open tags except XHTML self-contained tags。
如果您使用上述方法缩小页面大小,您应该考虑使用IIS压缩功能,因为大多数浏览器都可以利用该压缩功能,并且比您如何处理它更容易。以下是如何做到这一点在IIS 6和IIS 7:
http://technet.microsoft.com/en-us/library/cc771003(WS.10).aspx
请阅读更新的问题。我问了一件事,你回答了另一件事。 – tugberk 2012-01-06 19:15:14
+1 @tugberk你说“不知道如何修改它(正则表达式)”,并且给定链接的答案是“不这样做”。为正确的工作使用正确的工具,而正则表达式不是解析Html的工具。 – asawyer 2012-01-06 19:39:40
不是故意开始圣战,对不起,你觉得我浪费了你的时间。我会看看我是否可以在单独的帖子中回答您更新的问题。 – Milimetric 2012-01-06 19:44:01
也许把它分解成四个步骤:
- 提取使用正则表达式的任何匹配的PRE元素,简单的东西like“
start with <pre>(anything not </pre>)* end with </pre>
” - 用单独的GUID替换每个匹配项并保存GUID - > pre元素html字典。
- 拿出空白(不会影响的GUID或它们的位置。
- 迭代通过你在第2保存字典,把预元素早在正确的位置。
http://*.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – asawyer 2012-01-06 19:07:37
4〜5 kb每页是不是什么! – fge 2012-01-06 19:51:35
这个正则表达式非常糟糕,无论谁写它都不知道他们在做什么。 – Qtax 2012-01-06 20:33:46