PHP DOMDocument - 获取BODY的html源代码

lee*_*ers 17 html php parsing dom domdocument

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

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

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

Ala*_*orm 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)));
Run Code Online (Sandbox Code Playgroud)

这里有一个警告.有时,loadHTML在遇到格式不佳的HTML文档时会发出警告.如果您要解析这些HTML文档,则需要找到更好的html解析器 [self link warning].

  • 这将返回<body> [CONTENT] </ body> ...你怎么能得到[内容]? (3认同)

Pas*_*TIN 4

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

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

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

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

<div><p>Hello World
Run Code Online (Sandbox Code Playgroud)

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

<div><p>Hello World</p></div>
Run Code Online (Sandbox Code Playgroud)

好多了,不是吗?;-)

(请注意,HTMLPurfier 支持多种选项,查看其文档可能不会有什么坏处)

  • 这里有很好的信息,但我认为 DOMDocument 仍然是一个合法的工具。“loadHTML”方法的存在意味着 DOMDocument 用于解析 HTML 文档以及 XML 文档。HTMLPurifier 或其他用 PHP 编写的“真正的”HTML 解析器都很棒,但是它们的性能。与内置的 PHP 对象相比,它总是显得苍白无力。 (5认同)