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);
这很好地解析了片段并添加了适当的结束标签。问题是我还得到了一堆我不想要的标签,例如<!DOCTYPE>
、<html>
、<head>
和<body>
。我知道每个格式良好的 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 获取元素的序列化 HTML?