相关疑难解决方法(0)

如何过滤除特定白名单之外的所有HTML标记?

这适用于.NET.IgnoreCase已设置且未设置MultiLine.

通常我在正则表达式上都很不错,也许我的咖啡因含量很低......

允许用户输入HTML编码的实体(<lt;,<amp;等),并使用以下HTML标记:

u, i, b, h3, h4, br, a, img
Run Code Online (Sandbox Code Playgroud)

允许自动关闭和<img />,有或没有额外空间,但不是必需的.

我想要:

  1. 除去上面列出的所有开始和结束HTML标记之外.
  2. 从剩余标签中删除属性,锚点可以有href.

到目前为止,我的搜索模式(替换为空字符串):

<(?!i|b|h3|h4|a|img|/i|/b|/h3|/h4|/a|/img)[^>]+>
Run Code Online (Sandbox Code Playgroud)

似乎剥离了我想要的所有开始和结束标签,但有三个问题:

  1. 必须包含每个允许标记的结束标记版本是丑陋的.
  2. 属性存活下来.这可以在一次更换中发生吗?
  3. 标签开始允许的标签名漏网之鱼.例如,"<abbrev>"和"<iframe>".

以下建议的模式不会删除没有属性的标记.

</?(?!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)

我认为仍然可以对这个答案进行一些小的调整:

  1. 我认为可以通过在"可接受的"变量中添加"! - "并对表达式的末尾进行小的更改以允许可选的尾随来修改以捕获简单的HTML注释(那些本身不包含标记的注释) "\ S--".

  2. 我认为如果属性之间存在多个空白字符,这将会中断(例如:带有换行符的重格式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)

html c# regex vb.net

35
推荐指数
2
解决办法
3万
查看次数

标签 统计

c# ×1

html ×1

regex ×1

vb.net ×1