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

PHP使用DOMDocument按style属性删除span时文本误进入首个span问题

问题原因

当使用LIBXML_HTML_NOIMPLIED参数加载无唯一根节点的HTML片段时,DOMDocument会默认将第一个元素作为公共根节点,所有后续同级节点都会被自动归入该元素内部,所以你把待删除span的子节点插入父节点时,实际父节点就是第一个未删除的span,导致文本全部被包裹进去。

解决方法

加载HTML时手动添加一层临时根节点,处理完成后再提取根节点内的内容即可,修正后代码如下:

$curr_notes = '<span style="color: rgb(226, 80, 65);"><br></span><span style="color: rgb(0, 0, 0);">TEXT 1</span><br><span style="color: rgb(0, 0, 0);">TEXT2</span>';
$pattern    = '//span[@style="color: rgb(0, 0, 0);"]';

$dom = new DOMDocument();
// 手动添加临时根节点,避免DOM自动合并节点
$dom->loadHTML('<div id="temp-wrapper">' . $curr_notes . '</div>', LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($dom);

foreach ($xpath->query($pattern) as $span) {
    while ($span->hasChildNodes()) {
        $child = $span->removeChild($span->firstChild);
        $span->parentNode->insertBefore($child, $span);
    }
    $span->parentNode->removeChild($span);
}

// 提取临时根节点下的所有内容,去掉临时包裹层
$wrapper = $dom->getElementById('temp-wrapper');
$clean_notes = '';
foreach ($wrapper->childNodes as $node) {
    $clean_notes .= $dom->saveHTML($node);
}

echo $clean_notes;

运行后输出结果和预期一致:
<span style="color: rgb(226, 80, 65);"><br></span>TEXT 1<br>TEXT2

内容的提问来源于stack exchange,提问作者drpudding

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 10:45:10