我正在使用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片段将被插入到现有的有效文档中。
答案 0 :(得分: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)));
这里有一个警告。有时,loadHTML在遇到格式不佳的HTML文档时会发出警告。如果您要解析这些HTML文档,则需要找到better html parser [自我链接警告]。
答案 1 :(得分:3)
在您的情况下,您不想使用HTML文档,而是使用HTML片段 - HTML代码的一部分;;这意味着DOMDocument并不是您所需要的。
相反,我宁愿使用类似HTMLPurifier (引用)的内容:
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支持多种选项,并且查看其文档可能不会受到影响)
答案 2 :(得分:1)
面对同样的问题,我在DOMDocument周围创建了一个名为SmartDOMDocument的包装器,以克服这个和其他一些缺点(例如编码问题)。
答案 3 :(得分:0)
这是从另一篇文章中获取并完美地供我使用:
$layout = preg_replace('~<(?:!DOCTYPE|/?(?:html|head|body))[^>]*>\s*~i', '', $layout);