我正在尝试使用simple_html_dom从HTML片段中删除所有跨度,我正在使用以下内容:
$body = "<span class='outer' style='background:red'>x<span class='mid' style='background:purple'>y<span class='inner' style='background:orange'>z</span></span></span>";
$HTML = new simple_html_dom;
$HTML->load($body);
$spans = $HTML->find('span');
foreach($spans as $span_tag) {
echo "working on ". $span_tag->class . " ... ";
echo "setting " . $span_tag->outertext . " equal to " . $span_tag->innertext . "<br/>\n";
$span_tag->outertext = (string)$span_tag->innertext;
}
$text = $HTML->save();
$HTML->clear();
unset($HTML);
echo "<br/>The Cleaned TEXT is: $text<br/>";
这是我浏览器中的结果:
http://www.pixeloution.com/RAC/clean.gif
那么为什么我最终只删除了最外面的跨度?
实际上,如果有更简单的方法,我就是游戏。对象是删除标签但保留其中的任何内容,包括其他标签,否则我只使用$ obj-&gt; paintext
好吧......显然我已经开始工作了,虽然奇怪的是,如果有人遇到这个问题,我还是想真正理解这个问题。知道它只是移除了最外面的跨度,我这样做了:
function cleanSpansRecursive(&$body) {
$HTML = new simple_html_dom;
$HTML->load($body);
$spans = $HTML->find('span');
foreach($spans as $span_tag) {
$span_tag->outertext = (string)$span_tag->innertext;
}
$body = (string)$HTML;
if($HTML->find('span')) {
$HTML->clear();
unset($HTML);
cleanSpansRecursive($body);
} else {
$HTML->clear();
unset($HTML);
}
}
它似乎有效。
答案 0 :(得分:1)
我的计算机或开发服务器上没有安装simple_html_dom
因此我无法测试,但从外观来看,设置$span_tag->outertext
会在里面创建新的span
个对象外部跨度,因此$HTML
中将不再存在旧引用。从最里面到外面应该修复它,因为引用将保持不变。
编辑:在第二次编辑中,每次进行替换时都会找到新创建的跨度,这就是它的工作原理。