Удаление вложенных тегов с помощью simpleHTML - PullRequest
3 голосов
/ 31 января 2010

Я пытаюсь использовать 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);
    }  
}

И, похоже, работает.

1 Ответ

1 голос
/ 31 января 2010

У меня не установлено simple_html_dom на моей машине или на сервере разработки, поэтому я не могу тестировать, но, судя по всему, установка $span_tag->outertext создаст новые span объекты внутри внешнего диапазона, поэтому старые ссылки больше не будут существовать в $HTML. Переход от самого внутреннего к внешнему должен исправить это, поскольку ссылки будут сохранены.

РЕДАКТИРОВАТЬ: При втором редактировании вы находите вновь созданные отрезки каждый раз, когда выполняете замену, и поэтому он работает.

...