You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解析含未转义&符号的HTML?DOMDocument报错解决

解决DOMDocument解析含未转义&的HTML时提取href异常的问题

问题原因

客户网站HTML中存在未转义的&符号(比如链接文本里的Campus & Staff),DOMDocument的HTML解析器会将这类&视为实体引用的起始,但因为缺少后续的;或合法实体名称,触发解析警告,甚至导致href提取异常。

可行解决方案

方案1:先获取HTML内容并修复未转义&,再加载解析

既然无法直接修改源网站的HTML,可先拉取页面内容,用正则修复未转义的&,再交给DOMDocument处理:

// 拉取目标页面HTML内容
$htmlContent = file_get_contents($url);
// 替换所有未转义的&为&,不破坏已有的合法实体(如 、<等)
$fixedHtml = preg_replace('/&(?!#?[a-z0-9]+;)/i', '&', $htmlContent);

// 初始化DOMDocument并禁用错误输出
$dom = new DOMDocument('1.0', 'UTF-8');
libxml_use_internal_errors(true);
$dom->loadHTML($fixedHtml);
libxml_clear_errors(); // 清除解析过程中的错误记录

// 正常提取所有a标签的href属性
$linkNodes = $dom->getElementsByTagName('a');
foreach ($linkNodes as $node) {
    $href = $node->getAttribute('href');
    // 可根据需求处理href(如补全绝对路径等)
    echo $href . PHP_EOL;
}

正则表达式/(?!#?[a-z0-9]+;)是负向预查,确保只替换那些不是合法实体开头的&,避免误改已正确转义的内容。

方案2:仅禁用解析错误输出,强制提取href

如果不想修改HTML内容,可先禁用libxml的错误输出,强制DOMDocument完成解析,再尝试提取href(部分场景下可能正常工作,但解析异常时仍可能丢失节点):

$dom = new DOMDocument('1.0', 'UTF-8');
// 禁用错误输出,避免警告信息泄露到页面
libxml_use_internal_errors(true);
$dom->loadHTMLFile($url);
libxml_clear_errors();

// 提取href
$linkNodes = $dom->getElementsByTagName('a');
foreach ($linkNodes as $node) {
    echo $node->getAttribute('href') . PHP_EOL;
}

注意:这种方法依赖DOMDocument的容错能力,若HTML结构损坏严重,仍可能出现href提取不全或错误的情况,优先推荐方案1。

内容的提问来源于stack exchange,提问作者Parapluie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 02:10:33