这适用于.NET.IgnoreCase已设置且未设置MultiLine.
通常我在正则表达式上都很不错,也许我的咖啡因含量很低......
允许用户输入HTML编码的实体( 允许自动关闭和,有或没有额外空间,但不是必需的. 我想要: 除去上面列出的所有开始和结束HTML标记之外. 从剩余标签中删除属性,但锚点可以有href. 到目前为止,我的搜索模式(替换为空字符串): 这似乎剥离了我想要的所有开始和结束标签,但有三个问题: 必须包含每个允许标记的结束标记版本是丑陋的. 属性存活下来.这可以在一次更换中发生吗? 标签开始允许的标签名漏网之鱼.例如," 以下建议的模式不会删除没有属性的标记. 如下所述,">"在属性值中是合法的,但可以肯定地说我不会支持它.此外,不会担心CDATA块等.只是一点点HTML. 到目前为止,漏洞的答案是最好的,谢谢!这是他的模式(希望PRE对我更好): 我认为仍然可以对这个答案进行一些小的调整: 我认为可以通过在"可接受的"变量中添加"! - "并对表达式的末尾进行小的更改以允许可选的尾随来修改以捕获简单的HTML注释(那些本身不包含标记的注释) "\ S--".u, i, b, h3, h4, br, a, img
<(?!i|b|h3|h4|a|img|/i|/b|/h3|/h4|/a|/img)[^>]+>
?(?!i|b|h3|h4|a|img)\b[^>]*>
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和属性之间的选项卡).
编辑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)
需要注意的是,A标签的HREF属性仍然被擦除,这是不理想的.
这是我为此任务编写的函数:
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"); }
编辑:出于某种原因,我将我之前的答案更正为单独的答案,所以我在这里巩固它们.
我会解释一下正则表达式,因为它有点长.
第一部分匹配一个开括号和0或1斜杠(如果它是一个关闭标记).
接下来,您将看到一个if-then结构,具有前瞻性.(?(?= SomeTag)然后| else)我正在检查字符串的下一部分是否是可接受的标签之一.您可以看到我将正则表达式字符串与可接受的变量连接起来,该变量是由垂直条分隔的可接受的标记名称,以便任何术语都匹配.如果它是一个匹配,你可以看到我输入"notag"这个词,因为没有标签可以匹配,如果可以接受,我想不管它.否则我转到else部分,在那里我匹配任何标签名称[az,AZ,0-9] +
接下来,我想匹配0个或更多属性,我假设它们的形式为attribute ="value".所以现在我将这个部分分组表示一个属性,但我使用?:来防止这个组被捕获速度:(?:\ s [az,AZ,0-9, - ] + =?(?:( [" ",']?).?\ 1?))
在这里,我从标签和属性名称之间的空白字符开始,然后匹配属性名称:[az,AZ,0-9, - ] +
接下来我匹配一个等号,然后引用.我对报价进行分组以便将其捕获,我可以稍后进行反向引用\ 1以匹配相同类型的报价.在这两个引号之间,您可以看到我使用句点来匹配任何内容,但是我使用了懒惰版本*?而不是贪婪的版本*,以便它只匹配将结束此值的下一个引用.
接下来我们在用括号关闭组之后放置*,以便它匹配多个attirbute /值组合(或者没有).最后我们将一些空格与\ s匹配,并在xml样式自闭标记的标记中匹配0或1个结束斜杠.
你可以看到我正在用香肠替换标签,因为我很饿,但是你也可以用空字符串替换它们来清除它们.
这是关于html标签过滤的一个很好的工作示例:
清理HTML