Стрить HTML-теги и их содержимое

Я использую 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

Ответы

Ответ 1

Попробуйте удалить промежутки непосредственно из дерева 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();

Ответ 2

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

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

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