C#中的HTML白名单

5
花了大约30分钟在SO上寻找解决此问题的明确方法。虽然这个问题似乎已经被问过很多次,但是:
  • 大部分解决方案使用正则表达式。
  • 有很多帖子说不应该使用正则表达式来处理HTML。
  • 有许多答案只是给出了一个指向HTMLAgilityPack(在Codeplex上)的链接,但没有实际使用此包来满足所述要求的示例。
因此,我正在寻找最佳解决方案,以满足以下要求:
  • 我想提供一个允许的HTML标签列表。
  • 不在允许列表中的标签应该与其属性和内容一起被删除。
  • 允许列表中的任何标签都应该保留其属性和内容。
  • 该解决方案应应对不同的本地化-可能会使用语言和字符集与英语不同的用户。
  • [添加] 该解决方案应处理诸如论坛帖子之类的文本,而不是完整的HTML页面-因此像b u i等标记将被允许,但script div等标记则不允许且应该被删除。
我正在寻找一个C#解决方案,如果最好使用RegEx,我很乐意这样做。如果有现有的库可以做到这一点,我也很乐意使用它们。如有可能,请提供一些示例代码。
我正在寻找一个明确而经过试验的解决该问题的方法,而不是进行广泛的辩论+关闭帖子等 :) :)
提前感谢您。

1
我们是在讨论一个有效的HTML文档,还是一个包含一些HTML标签的文本,例如论坛帖子? - Daniel Hilgarth
@DanielHilgarth - 很好的观点,我会更新问题。 - Remotec
对于论坛,您可能希望使用BBCode并使用转换器将其转换为HTML。然后,您可以简单地替换所有的<s>和</s>,而不必担心忘记阻止一些不常见的标签。 - Matthias
对于这个项目来说,更像是一个博客 - 我希望用户能够使用定义好的标签,其中包括div以及预先选择的类名列表。 - Remotec
1个回答

1
你可以使用 Html Agility Pack 来解析 HTML。然后你可以按照自己的喜好处理元素,并将其重新写回 HTML。

1
请提供一个示例,说明它如何满足我的要求。CodePlex 上关于 HTML Agility Pack 的示例很少。 - Remotec
每个应用程序都是独特的。因此,HTML Agility Pack 的文档不会包含有关如何解决问题的示例。但是,您可以使用 HTML Agility Pack 递归迭代 HTML 文档中的所有节点(“标记”)并删除您不想要的节点。 - Matthias
听起来很有趣 - 我会测试并回报。你有获取所有标签的代码片段吗? - Remotec
尝试使用“doc.DocumentElement.SelectNodes(“//*”)”选择HtmlDocument中的所有节点(使用XPath:http://www.w3schools.com/XPath/xpath_syntax.asp);另请参阅:http://htmlagilitypack.codeplex.com/wikipage?title=Examples - Matthias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接