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

Posted

技术标签:

【中文标题】从整个 Html 中删除空格,但在 pre 中使用正则表达式【英文标题】:Remove white space from entire Html but inside pre with regular expressions 【发布时间】:2012-02-04 11:41:12 【问题描述】:

在 ASP.NET MVC 3 上,我创建了一个动作过滤器,用于从整个 html 中删除空白。它大部分时间都像我预期的那样工作,但现在我需要更改正则表达式,以免触及 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(@"(?<=[^])\t2,|(?<=[>])\s2,(?=[<])|(?<=[>])\s2,11(?=[<])|(?=[\n])\s2,");
    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

有什么想法吗?

编辑:

重要提示:

我的意图完全不是加快响应时间。实际上, 也许这会减慢速度。我压缩了页面,这个缩小让我 每页增加大约 4 - 5 kb,这没什么。

【问题讨论】:

***.com/questions/1732348/… 每页 4 到 5 kb 是不是什么都没有! 这个正则表达式很糟糕,写它的人并不真正知道他们在做什么。 @tugberk,这是多余的,而且有些地方是错误的。删除第一个更改,删除第三个更改,删除所有 [] 字符。您最终会得到一个等效的表达式,但更短、更快、更简洁。 只是出于兴趣,您为什么对每个请求都这样做?为什么不把内容发布到网站上呢? 【参考方案1】:

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

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

(?<=\s)\s+

用空字符串替换这些匹配项以消除所有地方的双空格。

假设pre 标签内没有&amp;lt;&amp;gt;,您可以在表达式末尾添加(?![^&lt;&gt;]*&lt;/pre&gt;),使其在pre 标签内失败。这确保&lt;/pre&gt; 不遵循当前匹配,中间没有任何标签。

导致:

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

【讨论】:

这符合我的预期,谢谢!我也明白这不是推荐的方式。 不幸的是,如果 pre 中有 ,这将失败,如果 pre 用于显示代码,这可能很常见。 @RobW,应该没有,你应该用&amp;lt;&amp;gt;编码。【参考方案2】:

请参阅非常史诗般的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

【讨论】:

请阅读更新后的问题。我问了一件事,你回答了另一件事。 +1 @tugberk 你说“我不确定如何修改它(正则表达式)”,给定链接的答案是“不要那样做”。为正确的工作使用正确的工具,而正则表达式不是用来解析 Html 的工具。 不是有意发动圣战,抱歉让您觉得我浪费了您的时间。我会看看是否可以在单独的帖子中回答您更新后的问题。【参考方案3】:

也许把它分成四个步骤:

    使用正则表达式提取任何匹配的 PRE 元素,例如“start with &lt;pre&gt;(anything not &lt;/pre&gt;)* end with &lt;/pre&gt;”之类的简单内容 用单独的 GUID 替换每个匹配项,并保存 GUID 字典 -> pre element html。 去掉空格(不会影响 GUID 或其位置。 遍历您在 2. 中保存的字典,并将前置元素放回正确的位置。

【讨论】:

以上是关于从整个 Html 中删除空格,但在 pre 中使用正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

从 R 中的整个数据帧中删除空格

MySQL从整个列中删除所有空格

如何在VueJS中使用$ http.delete删除html元素

从CSV中删除前导空格会导致插入空行和删除行

格式化后从字符串中删除空格

swift - 从 var(UITextField 输入)中删除空格不起作用