2012-01-06 186 views
2

在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://stackoverflow.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

回答

5

解析HTML與正則表達式很複雜,任何簡單的解決方案可能容易折斷(使用正確的工具的工作。)話雖這麼說,我會告訴一個簡單的解決方案

首先我簡單,你必須在正則表達式:。

(?<=\s)\s+ 

用空字符串替換這些匹配以擺脫任何地方的雙空格。

假設有在pre標籤內沒有<>,你可以在表達式的末尾添加(?![^<>]*</pre>)使其失效的pre標籤內。這確保</pre>不會跟隨當前匹配,沒有任何標籤之間。

在所得:

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

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

+0

不幸的是,如果在pre中有< or >,那麼這會失敗,如果pre用於顯示代碼,這可能很常見。 – RobW 2012-04-23 04:15:34

+1

@RobW,應該沒有,你應該用'<'和'>'來編碼。 – Qtax 2012-04-26 08:03:21

0

由於所有正則表達式和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

0

也許把它分解成四個步驟:

  1. 提取使用正則表達式的任何匹配的PRE元素,簡單的東西like「start with <pre>(anything not </pre>)* end with </pre>
  2. 用單獨的GUID替換每個匹配項並保存GUID - > pre元素html字典。
  3. 拿出空白(不會影響的GUID或它們的位置。
  4. 迭代通過你在第2保存字典,把預元素早在正確的位置。