Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在字符串中转义特定的HTML标记_Html_Xml_Html Agility Pack - Fatal编程技术网

如何在字符串中转义特定的HTML标记

如何在字符串中转义特定的HTML标记,html,xml,html-agility-pack,Html,Xml,Html Agility Pack,我有一个要求,在网页中显示HTML标签之前,要避开HTML标签的黑名单。选择性的原因是允许保留格式(bod、斜体、字体等),但不允许保留任何会“破坏”页面的标记(脚本、元数据等) 经过一段时间的思考,我想出了两种方法: RegEx——几乎每个人都会告诉你,使用RegEx操作HTML是一个坏主意 HtmlAgilityPack 我认为我最好的(也是唯一的)解决方案是将字符串加载到HtmlAgilityPack中,并通过子节点递归地循环。对于每个节点,我将检查它是否在指定的黑名单上。如果是,我将退出

我有一个要求,在网页中显示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 &lt;meta http-equiv='refresh' /&gt; 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 ????
       }
    }