Убрать теги HTML и их содержимое - PullRequest
15 голосов
/ 04 октября 2009

Я использую DOM для разбора строки. Мне нужна функция, которая удаляет теги span и их содержимое. Например, если у меня есть:

This is some text that contains photo.
<span class='title'> photobyile</span>

Я бы хотел, чтобы функция возвращала

This is some text that contains photo.

Вот что я пробовал:

    $dom = new domDocument;
    $dom->loadHTML($string);
    $dom->preserveWhiteSpace = false;
    $spans = $dom->getElementsByTagName('span');

    foreach($spans as $span)
    {
        $naslov = $span->nodeValue; 
        echo $naslov;

        $string = preg_replace("/$naslov/", " ", $string);
    }

Я знаю, что $span->nodeValue возвращает значение тега span, а не целый тег, но я не знаю, как получить целый тег вместе с именем класса.

Спасибо, Ile

Ответы [ 2 ]

9 голосов
/ 04 октября 2009

Попробуйте удалить участки напрямую из дерева DOM.

$dom = new DOMDocument();
$dom->loadHTML($string);
$dom->preserveWhiteSpace = false;

$elements = $dom->getElementsByTagName('span');
while($span = $elements->item(0)) {       
   $span->parentNode->removeChild($span);
}

echo $dom->saveHTML();
1 голос
/ 04 октября 2009

@ ile - у меня была такая проблема - это потому что индекс итератора foreach успешно продолжает увеличиваться, в то время как вызов метода removeChild () в DOM также, кажется, удаляет узлы из DomNodeList ($ spans). Таким образом, для каждого удаляемого диапазона список узлов сжимает один элемент, а затем увеличивает счетчик foreach на единицу. Чистый результат: он пропускает один промежуток.

Я уверен, что есть более элегантный способ, но я так и сделал - я переместил ссылки из DomNodeList во второй массив, где они не будут удалены операцией removeChild ().

    foreach($spans as $span) {
        $nodes[] = $span;
    }
    foreach($nodes as $span) {
        $span->parentNode->removeChild($span);
    }
...