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?
提前致谢
更新:从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)