我需要在显示然后在网页中之前转义HTML标记的黑名单。选择性的原因是允许保留格式(bod,斜体,字体等),但不允许任何会“破坏”页面的标记(脚本,元等)。
在考虑了一段时间后,我提出了两种方法:
我认为我最好的(也是唯一的)解决方案是将字符串加载到 HtmlAgilityPack 和递归循环子节点。对于每个节点,我会检查它是否在指定的黑名单中。如果是,我将逃离开头(并且如果它存在则关闭)节点,然后处理InnerHtml
。如果它不在列表中,则按原样输出节点,同时仍处理InnerHtml
。
所以,给出以下(非常简单的)源
The quick <b style='padding: 0 25em;'>brown</b> fox <b>jumped <i>over</i> the <meta http-equiv='refresh' /> moon</b>.
我需要以下输出
The quick <b style='padding: 0 25em;'>brown</b> fox <b>jumped <i>over</i> the <meta http-equiv='refresh' /> moon</b>.
经过大量研究后,我遇到了一些问题,问题和障碍。
HtmlAgilityPack
是用于此要求的最佳库吗?.Descendants()
方法,因为它通过内部递归返回所有节点的扁平列表,但这会导致重复的内容。使用上面的示例,<i>over</i>
节点是第二个b节点的InnerHtml
的一部分,但后来也成为Descendants集合中自己的节点。正如我所看到的,该方法看起来像这样的
public string EscapeHtmlTags(string value, ICollection<string> tags) {
var doc = new System.Text.StringBuilder();
doc.LoadHtml(doc);
if (tags.Contains(doc.DocumentNode.Name, StringComparer.CurrentCultureIgnoreCase)) {
// output opening tag as escaped string ????
EscapeHtmlTags(doc.DocumentNode.InnerHtml, tags);
// output closing tag as escaped string ????
}
else {
// output opening tag as is ????
EscapeHtmlTags(doc.DocumentNode.InnerHtml, tags);
// output closing tag as is ????
}
}
当然我仍然需要添加错误处理,并且可能以不同的方式处理各种NodeType,并且可能添加一个StringBuilder实例来收集输出,等等......我甚至可以采用克隆和替换现有的方法文档中的节点。
有什么想法或想法吗?
答案 0 :(得分:0)