這是針對.NET的。 IgnoreCase已設置且MultiLine未設置。如何過濾除特定白名單之外的所有HTML標記?
通常我在正則表達式體面的,也許我跑低咖啡因...
用戶被允許進入的HTML編碼實體(< LT ;,<安培;等),和使用以下HTML標籤:
u, i, b, h3, h4, br, a, img
自動關閉< BR/>和< IMG/>是允許的,有或沒有額外的空間,但不是必需的。
我想:
- 地帶所有的開始和結束除上述列出的HTML標籤。
- 從其餘標籤中刪除屬性除了錨可以有一個href。
我的搜索模式(用空字符串替換)至今:
<(?!i|b|h3|h4|a|img|/i|/b|/h3|/h4|/a|/img)[^>]+>
這似乎是剝離所有我想要的開始和結束標記,但有三個問題:
- 必須包含每個允許標記的結束標記版本是醜陋的。
- 屬性存活。這可以發生在一個單一的替代?
- 標籤以開頭,允許的標籤名稱通過。例如,「<縮寫>」和「<iframe>」。
以下建議的模式不會去掉沒有屬性的標籤。
</?(?!i|b|h3|h4|a|img)\b[^>]*>
如下文所述,「>」是屬性值的法律,但它肯定地說,我不會支持。另外,不會有CDATA塊等問題。只是一個小小的HTML。
漏洞的答案是迄今爲止最好的答案,謝謝!下面是他的模式(希望的PRE更好地工作對我來說):
static string SanitizeHtml(string html)
{
string acceptable = "script|link|title";
string stringPattern = @"</?(?(?=" + acceptable + @")notag|[a-zA-Z0-9]+)(?:\s[a-zA-Z0-9\-]+=?(?:([""']?).*?\1?)?)*\s*/?>";
return Regex.Replace(html, stringPattern, "sausage");
}
一些小的調整,我認爲仍然可以對這個回答讓:
我認爲這可能被修改,以獲取簡單的HTML通過將「! - 」添加到「可接受的」變量並對錶達式的末尾進行小的更改以允許可選的尾隨「\ s--」,來評論(本身不包含標籤的評論)。
我認爲如果在屬性之間存在多個空白字符(例如:帶有換行符和屬性之間的製表符的大量格式的HTML),這會中斷。
編輯2009-07-23:下面是最終的解決方案我(在VB.NET)去:
Dim AcceptableTags As String = "i|b|u|sup|sub|ol|ul|li|br|h2|h3|h4|h5|span|div|p|a|img|blockquote"
Dim WhiteListPattern As String = "</?(?(?=" & AcceptableTags & _
")notag|[a-zA-Z0-9]+)(?:\s[a-zA-Z0-9\-]+=?(?:([""']?).*?\1?)?)*\s*/?>"
html = Regex.Replace(html, WhiteListPattern, "", RegExOptions.Compiled)
需要說明的是,標籤的HREF屬性仍然得到擦洗,這並不理想。
請刪除不必要的[常規]標籤 – 2008-11-28 14:54:47
你有沒有運氣消除屬性?漏洞的答案似乎沒有做到這一點? – russau 2009-07-23 02:35:33