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].
在您的情况下,您不想使用 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 支持多种选项,查看其文档可能不会有什么坏处)