PHP中使用XPath获取<td>内第二个<br>前内容报错求助
解决提取元素中第二个
之前内容的问题
之前内容的问题
嘿,我来帮你搞定这个问题!你遇到的explode() expects parameter 2 to be string错误,根源在于$xpath->query()返回的是DOMNodeList对象,不是直接的字符串,所以没法直接传给explode处理。下面给你两种靠谱的解决方案:
方法一:先把DOM节点转成字符串再拆分
先获取目标<td>元素的HTML内容,再用字符串拆分的方式提取你要的部分:
$query_paradigma = '//span[contains(@class, "style11")][1]/parent::td'; $contenuto_paradigma = $xpath->query($query_paradigma); // 先确认是否找到对应的td元素 if ($contenuto_paradigma->length > 0) { $tdElement = $contenuto_paradigma->item(0); // 把td元素的HTML内容转成字符串 $tdHtml = $tdElement->ownerDocument->saveHTML($tdElement); // 用正则拆分<br>(兼容<br>和<br/>两种写法) $parts = preg_split('/<br\s*\/?>/i', $tdHtml); // 提取第二个<br>之前的内容(前两部分拼接,保留第一个<br>) if (count($parts) >= 2) { $targetContent = trim($parts[0]) . '<br>' . trim($parts[1]); echo $targetContent; } else { echo "未找到足够的<br>标签"; } } else { echo "未匹配到目标<td>元素"; }
方法二:用XPath直接定位目标节点(更健壮)
如果不想处理字符串拆分的兼容性问题,直接用XPath精准选取第二个<br>之前的所有节点,再拼接它们的HTML:
// 选取目标td下,所有在第二个<br>之前的节点 $query = '//td[span[contains(@class, "style11")]]/node()[count(preceding-sibling::br) < 2]'; $nodes = $xpath->query($query); $targetHtml = ''; if ($nodes->length > 0) { foreach ($nodes as $node) { $targetHtml .= $node->ownerDocument->saveHTML($node); } // 清理多余的空白字符(可选) $targetHtml = preg_replace('/\s+/', ' ', $targetHtml); echo $targetHtml; } else { echo "未找到目标内容"; }
小提示
- 方法一适合HTML结构简单固定的场景,但要注意
<br>的写法可能有变体(比如带空格的<br />),所以用正则拆分比explode更稳妥。 - 方法二直接通过DOM节点定位,不受HTML格式小变化的影响,更适合复杂或动态生成的HTML。
内容的提问来源于stack exchange,提问作者Borja
相关产品推荐
相关产品推荐

