从整个Html中移除空格,但在pre中使用正则表达式

时间:2012-01-06 19:01:05

标签: c# javascript asp.net asp.net-mvc regex

在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);
}

过滤器的整个代码:

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

有什么想法吗?

修改

BIG注意:

  

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

3 个答案:

答案 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://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

答案 2 :(得分:0)

也许将其分解为四个步骤:

  1. 使用正则表达式提取任何匹配的PRE元素,类似于“start with <pre>(anything not </pre>)* end with </pre>
  2. 使用单独的GUID替换每个匹配并保存GUID字典 - &gt; pre element html。
  3. 取出空格(不会影响GUID或其位置。
  4. 遍历您在2.中保存的字典,并将前部元素放回正确的位置。