如何在字符串中转义特定的HTML标记
我有一个要求,在网页中显示HTML标签之前,要避开HTML标签的黑名单。选择性的原因是允许保留格式(bod、斜体、字体等),但不允许保留任何会“破坏”页面的标记(脚本、元数据等) 经过一段时间的思考,我想出了两种方法:如何在字符串中转义特定的HTML标记,html,xml,html-agility-pack,Html,Xml,Html Agility Pack,我有一个要求,在网页中显示HTML标签之前,要避开HTML标签的黑名单。选择性的原因是允许保留格式(bod、斜体、字体等),但不允许保留任何会“破坏”页面的标记(脚本、元数据等) 经过一段时间的思考,我想出了两种方法: RegEx——几乎每个人都会告诉你,使用RegEx操作HTML是一个坏主意 HtmlAgilityPack 我认为我最好的(也是唯一的)解决方案是将字符串加载到HtmlAgilityPack中,并通过子节点递归地循环。对于每个节点,我将检查它是否在指定的黑名单上。如果是,我将退出
InnerHtml
。如果该节点不在列表中,则在仍处理InnerHtml
时按原样输出该节点
因此,考虑到以下(非常简单的)来源
当然,我仍然需要添加错误处理,可能需要以不同的方式处理各种节点类型,可能还需要添加一个StringBuilder实例来收集输出,等等。。。我甚至可以采用克隆和替换文档中现有节点的方法
有什么想法或想法吗?您应该在后端执行此操作,即在PHP中:
此函数支持允许的标记列表,您可以使用。我一般不喜欢正则表达式,尤其不喜欢使用正则表达式解析HTML,但在这种情况下,我认为可以使用它,因为现有的HTML层次结构根本不重要,您基本上只是想替换所有的
@GolezTrol-我最终按照您的建议使用了RegEx。控制HtmlAgilityPack输出的限制太多了。请随意转载作为答案,这样我可以给你信用。谢谢。你可以相信自己。我只同意你自己已经想出的方法之一。:)谢谢米朗,但我们不是PHP商店。如果您的回答主要是在后端处理这个问题,那么我已经朝着这个方向前进了。我只是想找出在.NET中使用的最佳方法(即工具)。
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>.
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 ????
}
}