PHP DOMDocument - 获取 BODY 的 html 源代码

2022-08-30 22:04:11

我正在使用PHP的DOMDocument来解析和规范化用户提交的HTML,使用该方法来解析内容,然后通过以下方式获得格式良好的结果:loadHTMLsaveHTML

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

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


答案 1

问题的快速解决方案是使用 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文档,你需要找到一个更好的html解析器[自我链接警告]。


答案 2

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

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

HTML Purifier是一个用PHP编写的符合标准的HTML过滤器库。HTML Purifier不仅会通过经过彻底审核,安全但宽松的白名单删除所有恶意代码(更广为人知的XSS),还可以确保您的文档符合标准,这只有在全面了解W3C规范的情况下才能实现。

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

<div><p>Hello World

使用HTMLPurifier的演示页面,您将获得这个干净的HTML作为输出:

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

好多了,不是吗?;-)

(请注意,HTMLPurfier提供了广泛的选项,查看其文档可能不会造成伤害)


推荐