我正在尝试使用 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->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);
}
}
它似乎有效。