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

tug*_*erk 2 javascript c# regex asp.net asp.net-mvc

在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);
}
Run Code Online (Sandbox Code Playgroud)

过滤器的整个代码:

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

任何的想法?

编辑:

大注:

我的意图完全没有加快响应时间.事实上,这可能会减慢速度.我GZiped页面,这个缩小使我每页获得大约4 - 5 kb,这没什么.

Qta*_*tax 5

使用正则表达式解析HTML非常复杂,任何简单的解决方案都很容易破解.(使用正确的工具完成工作.)话虽如此,我将展示一个简单的解决方案.

首先,我简化了你必须的正则表达式:

(?<=\s)\s+
Run Code Online (Sandbox Code Playgroud)

用空字符串替换这些匹配,以消除到处的双重空格.

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

导致:

(?<=\s)\s+(?![^<>]*</pre>)
Run Code Online (Sandbox Code Playgroud)