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
相关产品推荐
相关产品推荐

