清除字串中的HTML標籤利用RegExp 進階版
- 2009-07-11
- 22053
- 0
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))[^>]*?>
這樣子就真的給他一目了然了,不過其實最後的?是可以不用加的,因為我已經明確的告訴他結尾了
回應討論