PHP DOMDocument - 获取BODY的html源代码

时间:2010-02-27 00:15:35

标签: php html dom parsing domdocument

我正在使用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 个答案:

答案 0 :(得分:23)

问题的快速解决方案是使用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 [自我链接警告]。

答案 1 :(得分:3)

在您的情况下,您不想使用HTML文档,而是使用HTML片段 - HTML代码的一部分;;这意味着DOMDocument并不是您所需要的。

相反,我宁愿使用类似HTMLPurifier (引用)的内容:

  

HTML Purifier符合标准   用PHP编写的HTML过滤器库。   HTML Purifier不仅会删除所有内容   恶意代码(更好地称为XSS)   经过全面审核,安全无缺   容许白名单,它也会   确保您的文档符合标准,仅限某些内容   可以全面实现   了解W3C的规范。

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

<div><p>Hello World

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

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

好多了,不是吗? ; - )

(请注意,HTMLPurfier支持多种选项,并且查看其文档可能不会受到影响)

答案 2 :(得分:1)

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

您可以在此处找到它:http://beerpla.net/projects/smartdomdocument

答案 3 :(得分:0)

这是从另一篇文章中获取并完美地供我使用:

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