代码之家  ›  专栏  ›  技术社区  ›  leepowers

php domdocument-获取正文的HTML源代码

  •  17
  • leepowers  · 技术社区  · 16 年前

    我使用php的domdocument来解析和规范用户提交的HTML loadHTML 方法解析内容,然后通过 saveHTML :

    $dom= new DOMDocument();
    $dom->loadHTML('<div><p>Hello World');
    $well_formed= $dom->saveHTML(); 
    echo($well_formed);
    

    这在解析片段和添加适当的结束标记方面做得很好。问题是我也得到了一些我不想要的标签,比如 <!DOCTYPE> , <html> , <head> <body> . 我知道每个格式良好的HTML文档都需要这些标记,但是我正在规范化的HTML片段将被插入到现有的有效文档中。

    4 回复  |  直到 12 年前
        1
  •  3
  •   Pascal MARTIN    16 年前

    在您的例子中,您不希望使用HTML文档,而是使用HTML片段(HTML代码的一部分);这意味着DOMDocument不是您所需要的。

    相反,我宁愿用 HTMLPurifier (引证) :

    HTML净化器符合标准 用PHP编写的HTML过滤器库。 HTML净化器将不仅删除所有 恶意代码(通常称为XSS) 以彻底审计,安全的 允许的白名单,它也会 确保您的文档符合标准 ,只有一些东西 通过综合 了解W3C规范。

    而且,如果您尝试您的代码部分:

    <div><p>Hello World
    

    使用 the demo page of HTMLPurifier ,将此干净的HTML作为输出:

    <div><p>Hello World</p></div>
    

    好多了,不是吗?;-)

    (请注意,HTMLPurfier支持多种选择,查看其文档可能不会造成伤害)

        2
  •  23
  •   Alana Storm    16 年前

    对您的问题的快速解决方案是使用一个xpath表达式来获取主体。

    $dom= new DOMDocument();
    $dom->loadHTML('<div><p>Hello World');      
    $xpath = new DOMXPath($dom);
    $body = $xpath->query('/html/body');
    echo($dom->saveXml($body->item(0)));
    

    这里有一句警告。有时,当loadHTML遇到格式很差的HTML文档时,它会发出警告。如果要分析这些类型的HTML文档,则需要找到 better html parser [自链接警告]。

        3
  •  1
  •   Artem Russakovskii    16 年前

    面对同样的问题,我创建了一个名为smartdomdocument的围绕domdocument的包装器来克服这个问题和其他一些缺点(例如编码问题)。

    你可以在这里找到它: http://beerpla.net/projects/smartdomdocument

        4
  •  0
  •   akahunahi    12 年前

    这是从另一个岗位上取的,非常适合我使用:

    $layout = preg_replace('~<(?:!DOCTYPE|/?(?:html|head|body))[^>]*>\s*~i', '', $layout);