这适用于.NET.IgnoreCase已设置且未设置MultiLine.
通常我在正则表达式上都很不错,也许我的咖啡因含量很低......
允许用户输入HTML编码的实体(<lt;,<amp;等),并使用以下HTML标记:
u, i, b, h3, h4, br, a, img
Run Code Online (Sandbox Code Playgroud)
允许自动关闭和<img />,有或没有额外空间,但不是必需的.
我想要:
到目前为止,我的搜索模式(替换为空字符串):
<(?!i|b|h3|h4|a|img|/i|/b|/h3|/h4|/a|/img)[^>]+>
Run Code Online (Sandbox Code Playgroud)
这似乎剥离了我想要的所有开始和结束标签,但有三个问题:
以下建议的模式不会删除没有属性的标记.
</?(?!i|b|h3|h4|a|img)\b[^>]*>
Run Code Online (Sandbox Code Playgroud)
如下所述,">"在属性值中是合法的,但可以肯定地说我不会支持它.此外,不会担心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");
}
Run Code Online (Sandbox Code Playgroud)
我认为仍然可以对这个答案进行一些小的调整:
我认为可以通过在"可接受的"变量中添加"! - "并对表达式的末尾进行小的更改以允许可选的尾随来修改以捕获简单的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*/?>" …
Run Code Online (Sandbox Code Playgroud)