从整个Html中删除空白空间,但内部预先使用正则表达式

从整个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); 
} 

所有代码:

https://github.com/tugberkugurlu/MvcBloggy/blob/master/src/MvcBloggy.Web/Application/ActionFilters/RemoveWhitespacesAttribute.cs

任何想法?

编辑:

BIG注:

我的意图是完全不加快响应时间。事实上, 也许会减慢速度。我Gziped页面,这种缩小使我 增益大约每页4-5 kb,这是什么。

+0

http://*.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – asawyer 2012-01-06 19:07:37

+0

4〜5 kb每页是不是什么! – fge 2012-01-06 19:51:35

+0

这个正则表达式非常糟糕,无论谁写它都不知道他们在做什么。 – Qtax 2012-01-06 20:33:46

解析HTML与正则表达式很复杂,任何简单的解决方案可能容易折断(使用正确的工具的工作。)话虽这么说,我会告诉一个简单的解决方案

首先我简单,你必须在正则表达式:。

(?<=\s)\s+ 

用空字符串替换这些匹配以摆脱任何地方的双空格。

假设有在pre标签内没有<>,你可以在表达式的末尾添加(?![^<>]*</pre>)使其失效的pre标签内。这确保</pre>不会跟随当前匹配,没有任何标签之间。

在所得:

(?<=\s)\s+(?![^<>]*</pre>) 
+0

这工作正如我所料,谢谢!我也明白,这不是推荐的方式。 – tugberk 2012-01-07 10:58:50

+0

不幸的是,如果在pre中有,那么这会失败,如果pre用于显示代码,这可能很常见。 – RobW 2012-04-23 04:15:34

+1

@RobW,应该没有,你应该用'<'和'>'来编码。 – Qtax 2012-04-26 08:03:21

由于所有正则表达式和HTML不相处的原因,请参阅非常史诗RegEx match open tags except XHTML self-contained tags

如果您使用上述方法缩小页面大小,您应该考虑使用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

+0

请阅读更新的问题。我问了一件事,你回答了另一件事。 – tugberk 2012-01-06 19:15:14

+0

+1 @tugberk你说“不知道如何修改它(正则表达式)”,并且给定链接的答案是“不这样做”。为正确的工作使用正确的工具,而正则表达式不是解析Html的工具。 – asawyer 2012-01-06 19:39:40

+0

不是故意开始圣战,对不起,你觉得我浪费了你的时间。我会看看我是否可以在单独的帖子中回答您更新的问题。 – Milimetric 2012-01-06 19:44:01

也许把它分解成四个步骤:

  1. 提取使用正则表达式的任何匹配的PRE元素,简单的东西like“start with <pre>(anything not </pre>)* end with </pre>
  2. 用单独的GUID替换每个匹配项并保存GUID - > pre元素html字典。
  3. 拿出空白(不会影响的GUID或它们的位置。
  4. 迭代通过你在第2保存字典,把预元素早在正确的位置。