17

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

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

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

4

4 回答 4

26

您的问题的快速解决方案是使用 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 解析器[self link warning]。

于 2010-02-27T00:52:34.893 回答
3

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

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

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

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

<div><p>Hello World

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

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

好多了,不是吗?;-)

(请注意,HTMLPurfier 支持范围广泛的选项,并且查看其文档可能不会受到伤害)

于 2010-02-27T00:21:12.900 回答
1

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

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

于 2010-03-12T10:01:18.630 回答
0

这取自另一篇文章,非常适合我的使用:

$layout = preg_replace('~<(?:!DOCTYPE|/?(?:html|head|body))[^>]*>\s*~i', '', $layout);
于 2014-01-04T01:05:34.050 回答