PHP中使用DOMDocument类的函数报错,请求排查原因
问题分析与修复方案
咱们来一步步拆解你遇到的两个问题:
1. 警告:DOMDocument::loadHTML(): Empty string supplied as input
从报错堆栈能看到,你在index.php第12行调用getTitleAndLinks(false)时,传入的参数是false,而不是有效的HTML字符串。DOMDocument::loadHTML()需要非空的HTML内容,传入空值或者false就会触发这个警告——相当于你给解析器递了个空文件,它当然会抱怨啦。
2. 致命错误:Uncaught Error: Call to a member function getElementsByTagName() on null
这个错误的直接原因是$doc->getElementById("content")没有找到ID为content的元素,返回了null,之后你尝试在null上调用getElementsByTagName(),这就像对着空气喊“给我拿东西”,肯定会出错。而导致找不到元素的根源,还是因为第一个问题里的空输入——DOM文档是空的,自然找不到任何元素;当然也有可能是你传入的HTML本身就没有id="content"的元素。
具体修复步骤
我给你调整一下代码,加上输入校验和空值判断,就能彻底解决这些问题:
第一步:给函数加上输入校验和空元素判断
function getTitleAndLinks($content) { // 先检查输入是否有效:不能是空值,必须是字符串 if (empty($content) || !is_string($content)) { return []; // 直接返回空数组,或者根据业务需求抛出异常 } $doc = new \DOMDocument(); // 加上@符号抑制HTML解析时的警告(可选,因为很多网页的HTML不规范,会输出一堆警告) @$doc->loadHTML($content); $links = []; // 先确认找到content容器,再继续遍历链接 $container = $doc->getElementById("content"); if ($container) { $arr = $container->getElementsByTagName("a"); foreach($arr as $item) { $href = $item->getAttribute("href"); $title = $item->getAttribute("title"); if($item->hasAttribute('rel') && $item->getAttribute('rel') == 'bookmark') { $links[] = [ 'href' => $href, 'title' => $title ]; } } } return $links; }
第二步:修复调用函数时的传入值
在index.php第12行,你传入的是false,得确保这里传入的是正确获取到的HTML内容。比如如果是用file_get_contents()获取网页内容,要先检查是否成功:
// 示例:获取HTML内容 $htmlContent = file_get_contents('目标网页URL或本地文件路径'); // 检查是否获取成功 if ($htmlContent === false) { // 处理获取失败的情况,比如输出提示 $links = []; } else { $links = getTitleAndLinks($htmlContent); }
这样修改后,既避免了空输入导致的警告,也防止了在null对象上调用方法的致命错误,代码的健壮性会提升很多。
内容的提问来源于stack exchange,提问作者Mariusz
相关产品推荐
相关产品推荐

