第一時間覺得用 Regular Expression 來去掉 HTML 標籤應該是剛剛好而已,上網搜尋其實有很多資源,其中一篇:C# Remove HTML Tags 相當值得參考,文中作者撰寫一個 HtmlRemoval 類別,可用來完全去除 HTML 標籤,更進一步測試用 Char Array 逐字處理效能出奇的好!這邊推測是利用角括號 <、> 簡單判別會比起 Regex 用模式比對要有效率。
仍需提醒各位,利用 Char Array 逐字處理是相當快沒錯,不過你得注意 HTML 標籤一旦只有左角括號,遺漏右角括號時,將沒有任何內文被保留下來,這點其實原作者在文章內有說明,怕大家漏看了再雞婆一下,如果你實在沒有把握會不會遇到這種狀況,那建議還是採用 Regex 處理較妥當。
事實上 Regex 還是有其優勢,那就是處理字串的能力可謂無敵啊,例如我收到的需求還要有條件保留 HTML 標籤,也就是說某些標籤可能是不希望去掉的,因此我將上述的 HtmlRemoval 類別加上底下的方法:
/// <summary> /// 去除 HTML 標籤,可自訂合法標籤加以保留 /// </summary> /// <param name="src">來源字串</param> /// <param name="reservedTagPool">合法標籤集</param> /// <returns></returns> public static string StripTags(string src, string[] reservedTagPool) { return Regex.Replace( src, String.Format("<(?!{0}).*?>", string.Join("|", reservedTagPool)), String.Empty); }
這樣一來如果我要保留圖檔以及斷行標籤可以這樣寫:
using System; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { string html = "<div><p>點部落是培養佛心的好地方!<br />" + "<img src=\"http://www.dotblogs.com.tw/Images/DotBlogsLogo.gif\" alt="\"Dotblogs" Logo\" /></p></div>"; string[] reservedTagPool = { "img", "br" }; TextBox1.Text = html; TextBox2.Text = HtmlRemoval.StripTags(html, reservedTagPool); Literal1.Text = HtmlRemoval.StripTags(html, reservedTagPool); } }
效果參見下圖:OK,降子佛心程式碼就大致完成囉!