如何解析含未转义&符号的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
相关产品推荐
相关产品推荐

