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

Bjö*_*örn 8 html php parsing domdocument

我一直试图通过使用HTML DomObject来解析网页,以便将它们用于应用程序以扫描它们的SEO质量.

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

<head>
<meta name="description" content="randomdesciption">
</head>
<title>sometitle</title>
Run Code Online (Sandbox Code Playgroud)

正如您所看到的那样,标题位于head标签之外,这是我想要检测的错误.

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

<head>
<meta name="description" content="randomdesciption">
</head>
<head><title>sometitle</title></head>
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

提前致谢

Gor*_*don 7

更新:从PHP 5.4开始,您可以使用 HTML_PARSE_NO_IMPLIED

$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED);
Run Code Online (Sandbox Code Playgroud)

原答案如下

你不能.从理论上讲,libxml中有一个标志HTML_PARSE_NO_IMPLIED可以防止添加隐含的标记,但是无法从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;
Run Code Online (Sandbox Code Playgroud)

在我的机器上会给

<!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
Run Code Online (Sandbox Code Playgroud)

  • 现在可以在PHP v5.4 +中使用[loadhtml](http://php.net/manual/en/domdocument.loadhtml.php)方法的第二个参数'options'. (5认同)