demoshop

demo, trying to be the best_

demo 在幾天前遇到了一個需求,因為我們有類似留言板的機制但是因為是銜接的系統,客戶要求保留之前的留言格式但為了安全我又非得要做Encode的動作實在是兩難,後來想到利用RegExp的方式來保留我想要的TAG或許可行就玩了下去。

拿了之前介紹的「清除字串中的HTML標籤利用RegExp」來檔,但是這樣所有格式都消失了,實在不是我想要的於是就想來改寫一下達到我的需求。

原本用的 Pattern 是

<[^>]*> 

這樣子會過濾掉所有的<XXX>但我要指定排除幾項,比如說對於字型的設定和斷行格式

/// <summary>          
/// 過濾所有的HTML Tag(保留字型與斷行)
/// </summary>          
/// <param name="text">要被過濾的文字</param>          
/// <returns></returns>          
static public string MakePlainText(this HtmlHelper helper, string text)
{
    Regex regex = new System.Text.RegularExpressions.Regex(@"<(?!br|\/?p|b|\/?font|font color)[^>]*>");
    text = regex.Replace(text, "");
    return text;
}

上面的寫法是 ASP.NET MVC 擴充 HtmlHelper 的寫法,還請自行修改。


此篇被保哥(will)看到以後他就冷冷的走出辦公室和我說:「嗯,有Bug!」

首先建議我在最後的星字號後要再加上?避免越界

再來建議我不要用 \/?p 這種可讀性很差的寫法

並且字句最好使用()包起來於是就把 Pattern 改為以下的寫法囉

<(?!(br)|(p)|(/p)|(/font)|(font color))[^>]*?>

這樣子就真的給他一目了然了,不過其實最後的?是可以不用加的,因為我已經明確的告訴他結尾了

回應討論