使用simpleHTML删除嵌套标记

时间:2010-01-31 05:34:10

标签: php simple-html-dom

我正在尝试使用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

编辑#2

好吧......显然我已经开始工作了,虽然奇怪的是,如果有人遇到这个问题,我还是想真正理解这个问题。知道它只是移除了最外面的跨度,我这样做了:

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);
    }  
}

它似乎有效。

1 个答案:

答案 0 :(得分:1)

我的计算机或开发服务器上没有安装simple_html_dom因此我无法测试,但从外观来看,设置$span_tag->outertext会在里面创建新的span个对象外部跨度,因此$HTML中将不再存在旧引用。从最里面到外面应该修复它,因为引用将保持不变。

编辑:在第二次编辑中,每次进行替换时都会找到新创建的跨度,这就是它的工作原理。