PHP提取<td>中第二个<br>前内容时explode报错求助
解决方法:获取中第二个
之前的内容
之前的内容
首先,你遇到的报错explode() expects parameter 2 to be string是因为$xpath->query()返回的是DOMNodeList对象,不是直接的字符串,explode()没法直接处理这个对象——得先把节点内容转换成字符串,或者用DOM API直接遍历处理。
错误原因拆解
你的代码里$contenuto_paradigma = $xpath->query($query_paradigma);得到的是一个DOM节点列表,哪怕只有一个匹配的<td>,它也是列表类型,不能直接传给explode()。
方案1:先转成HTML字符串再处理
这种方法适合结构简单的HTML,先把<td>的内容转成字符串,再分割截取:
$query_paradigma = '//span[contains(@class, "style11")][1]/parent::td'; $contenuto_paradigma = $xpath->query($query_paradigma); // 先获取第一个匹配的<td>节点 $tdNode = $contenuto_paradigma->item(0); if ($tdNode) { // 将节点转换为完整的HTML字符串 $dom = new DOMDocument(); $clonedTd = $tdNode->cloneNode(true); $dom->appendChild($clonedTd); $tdHtml = $dom->saveHTML(); // 用正则分割(兼容<br>、<br/>、<br >等写法),分割成3份 $parts = preg_split('/<br\s*\/?>/i', $tdHtml, 3); // 拼接前两部分(包含第一个<br>,到第二个<br>之前的内容) if (count($parts) >= 2) { $result = $parts[0] . '<br>' . $parts[1]; echo $result; } else { // 如果不足两个<br>,直接输出全部内容 echo $tdHtml; } } else { echo "未找到匹配的<td>节点"; }
方案2:用DOM API遍历节点(更准确)
如果你的HTML结构可能有复杂嵌套,用DOM遍历的方式更可靠,直接找到第二个<br>就停止:
$query_paradigma = '//span[contains(@class, "style11")][1]/parent::td'; $contenuto_paradigma = $xpath->query($query_paradigma); $tdNode = $contenuto_paradigma->item(0); if ($tdNode) { $resultHtml = ''; $brCounter = 0; $dom = new DOMDocument(); foreach ($tdNode->childNodes as $child) { // 遇到<br>就计数 if ($child->nodeName === 'br') { $brCounter++; // 把当前<br>加入结果 $resultHtml .= $dom->saveHTML($child); // 第二个<br>出现后立即停止遍历 if ($brCounter === 2) { break; } } else { // 其他节点直接转成HTML加入结果 $resultHtml .= $dom->saveHTML($child); } } echo $resultHtml; } else { echo "未找到匹配的<td>节点"; }
两种方案对比
- 方案1:代码更简洁,适合结构简单的HTML,正则已经兼容
<br>的常见写法。 - 方案2:完全基于DOM节点操作,不会因为HTML字符串的格式变化出错,适合复杂场景。
内容的提问来源于stack exchange,提问作者Borja
相关产品推荐
相关产品推荐

