加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2020-12-13 13:05:12 所属栏目:PHP教程 来源:网络整理
导读:我一直试图通过使用 HTML DomObject来解析网页,以便将它们用于应用程序以扫描它们的SEO质量. 但是我遇到了问题.出于测试目的,我写了一个包含以下不正确的html的小html页面: headmeta name="description" content="randomdesciption"/headtitlesometitle/tit
我一直试图通过使用 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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读