PHP DOMDocument - 获取 BODY 的 html 源代码

Posted

技术标签:

【中文标题】PHP DOMDocument - 获取 BODY 的 html 源代码【英文标题】:PHP DOMDocument - get html source of BODY 【发布时间】:2011-01-21 16:28:45 【问题描述】:

我正在使用 php 的 DOMDocument 来解析和规范化用户提交的 html,使用 loadHTML 方法解析内容,然后通过 saveHTML 获得格式正确的结果:

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

这很好地解析了片段并添加了适当的结束标签。问题是我还得到了一堆我不想要的标签,例如&lt;!DOCTYPE&gt;&lt;html&gt;&lt;head&gt;&lt;body&gt;。我知道每个格式良好的 HTML 文档都需要这些标签,但是我正在规范化的 HTML 片段将被插入到现有的有效文档中。

【问题讨论】:

【参考方案1】:

这是从另一个帖子中摘录的,非常适合我的使用:

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

【讨论】:

相关:***.com/questions/1732348/…【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

这将返回 [CONTENT] ...你怎么能只得到 [CONTENT]?【参考方案4】:

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

相反,我宁愿使用 HTMLPurifier (quoting) 之类的东西:

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 支持范围广泛的选项,查看其文档可能不会有什么坏处)

【讨论】:

这里有很好的信息,但我认为 DOMDocument 仍然是一个合法的工具。 “loadHTML”方法的存在意味着 DOMDocument 用于解析 HTML 文档以及 XML 文档。 HTMLPurifier 或其他用 PHP 编写的“真正的”HTML 解析器很棒,但它们的性能很好。与内置 PHP 对象相比,它总是显得苍白无力。 @Alan :我同意 DOMDocument 在解析 HTML 文档时非常棒;;;但是对于 HTML 部分,尤其是 user-submitted,我相信 HTMLPurifier 是一个更好的工具:它的创建正是为了过滤用户提交的 HTML —— 包括从安全的角度来看 (例如,DOMDocument 不关心 XSS,而 HTMLPurifier 关心 ;;; DOMDocument 不允许您指定应该允许哪些标签/属性,而 HTMLPUrifier 可以)

以上是关于PHP DOMDocument - 获取 BODY 的 html 源代码的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PHP DomDocument 获取规范值?

PHP DOMDocument 添加了额外的标签

PHP DOMDocument获取标签的属性

如何使用 PHP 的 DOMDocument 获取元素的序列化 HTML?

php DOMDocument nodeName 属性返回带有 nodeName 的“#text”

通过选择标记名称在PHP中创建属性