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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:01:29