如何防止PHP DomDocument“修复”您的HTML字符串

前端之家收集整理的这篇文章主要介绍了如何防止PHP DomDocument“修复”您的HTML字符串前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直试图通过使用 HTML DomObject来解析网页,以便将它们用于应用程序以扫描它们的SEO质量.

但是我遇到了问题.出于测试目的,我写了一个包含以下不正确的html的小html页面

<head>
<Meta name="description" content="randomdesciption">
</head>
<title>sometitle</title>

你可以看到标题在head标签之外,这是我试图检测的错误.

现在出现了问题,当我使用curl从此页面捕获响应字符串然后将其发送到dom文档以将其加载为HTML它通过在标题周围添加另一个标签来实际修复此问题.

<head>
<Meta name="description" content="randomdesciption">
</head>
<head><title>sometitle</title></head>

我已经检查了卷曲响应数据并且实际上不是问题,在执行loadHTML()方法时,PHP DomDocument以某种方式修复了html语法.

我还尝试通过将它们设置为false来关闭DomDocument recover,substituteEntities和validateOnParse属性,但没有成功.

我一直在搜索谷歌,但到目前为止我找不到任何答案.我想对某些人来说实际上希望破解的HTML不被修复是很少见的.

有谁知道如何防止DomDocument修复我破碎的HTML?

提前致谢

更新:从PHP 5.4开始,您可以使用 HTML_PARSE_NO_IMPLIED
$dom->loadHTML($html,LIBXML_HTML_NOIMPLIED);

原答案如下

你不能.在理论上there is a flag HTML_PARSE_NO_IMPLIED for that in libxml阻止添加隐含标记,但其无法从PHP访问.

在旁注中,这种特殊行为似乎取决于所使用的LIBXML_VERSION.

运行此代码段:

<?PHP
$html = <<< HTML
<head>
<Meta name="description" content="randomdesciption">
</head>
<title>sometitle</title>
HTML;

$dom = new DOMDocument;
$dom->loadHTML($html);
$dom->formatOutput = true;
echo $dom->saveHTML(),LIBXML_VERSION;

在我的机器上会给

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head><Meta name="description" content="randomdesciption"></head>
<title>sometitle</title>
</html>
20707

猜你在找的PHP相关文章