DOMDocument中结合getElementsByTagName与getElementsByClassName报错求助
解决DOMDocument中链式调用getElementsByTagName和getElementsByClassName的错误
你遇到的问题很典型——getElementsByTagName('p')返回的是DOMNodeList类型的对象,而这个对象并没有getElementsByClassName()方法,只有DOMDocument或者单个DOMElement节点才有这个方法,所以直接链式调用就会触发"undefined method"的错误。
下面给你两种可行的解决方案:
方案一:使用DOMXPath(推荐,更灵活)
DOMXPath可以直接通过路径表达式精准定位到你需要的标签,不用先筛选所有p标签再二次过滤,效率和可读性都更好:
$information = html_entity_decode($value['information']); $dom = new DOMDocument(); @$dom->loadHTML($information); // 初始化XPath对象 $xpath = new DOMXPath($dom); // 定位class为castplot的p标签 $targetElements = $xpath->query("//p[@class='castplot']"); // 检查是否找到目标元素 if ($targetElements->length > 0) { $castText = $targetElements->item(0)->textContent; // 这里就可以使用$castText了 }
如果你的目标p标签可能有多个class(比如<p class="castplot foo">),可以把XPath表达式改成更严谨的版本,避免匹配到类似castplot-other这样的class:
$targetElements = $xpath->query("//p[contains(concat(' ', normalize-space(@class), ' '), ' castplot ')]");
方案二:遍历DOMNodeList逐个检查
如果你不想用XPath,也可以先获取所有p标签,再循环遍历每个节点,检查它的class属性是否符合要求:
$information = html_entity_decode($value['information']); $dom = new DOMDocument(); @$dom->loadHTML($information); $pTags = $dom->getElementsByTagName('p'); $castText = ''; foreach ($pTags as $p) { $classAttr = $p->getAttribute('class'); // 简单判断(适合单个class的情况) if ($classAttr === 'castplot') { $castText = $p->textContent; break; // 找到第一个匹配的就停止遍历 } // 如果是多class场景,用下面的判断方式: // $classes = explode(' ', trim($classAttr)); // if (in_array('castplot', $classes)) { // $castText = $p->textContent; // break; // } } // 处理获取到的$castText
内容的提问来源于stack exchange,提问作者jazuly aja
相关产品推荐
相关产品推荐

