@Shimpanze

PHP DomDocument: откуда берутся лишние узлы?

Здравствуйте!

Написал код, который обрабатывает текстовые ноды (оборачивает их в тег параграфа):

<?php

$content = <<<'EOD'
<div>
Hello 1


Hello 2
<span>Hello 3</span>



Привет 4  
</div>
EOD;

$content = mb_convert_encoding( $content, 'HTML-ENTITIES', 'UTF-8' );

$dom = new DomDocument();

$dom->loadHTML( $content );

$xpath = new DomXPath( $dom );

$elements = $xpath->query( '//body/div/*|//body/div/text()' );

foreach( $elements as $element ) {

  // обрабатываем текстовые узлы
  if( $element->nodeName == '#text' ) {

    // Заменяем множество пустых строк на одну
    $text_strings = preg_replace( "/(^[\\s]*$)+/miu", "", $element->c14n() );

    // делим текстовую ноду на строки и обрабатываем их
    $text_strings = preg_split( "/\\r?\\n/", $text_strings, -1 );
    foreach( $text_strings as $text_string ) {
      // убираем лишние пробелы из середины и по краям
      echo "<p>" . trim( preg_replace( "/[ |\\t|\\0|\\x0B]+/", " ", $text_string ), " \t\0\x0B" ) . "</p>" . PHP_EOL;
    }

  }
  // для всех остальных (не текстовых узлов)
  else {
    echo $element->C14N(), PHP_EOL;
  }
}
?>


На выходе получаю обработанные строки с лишними, непонятно откуда взявшимися узлами сверху и снизу:

13043061.jpg

При этом, если не обрабатывать текстовые ноды, а выводить их напрямую, то этих лишних узлов там вообще нет:

13090164.jpg

Откуда они берутся и как сделать так, чтобы их не было. При этом обойтись без хаков по только их убиранию.
  • Вопрос задан
  • 180 просмотров
Решения вопроса 1
DevMan
@DevMan
чувак, я же уже писал тебе готовое решение.
пустая строка - это тоже текстовая нода. такие дела.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы