Здравствуйте!
Написал код, который обрабатывает текстовые ноды (оборачивает их в тег параграфа):
<?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;
}
}
?>
На выходе получаю обработанные строки с лишними, непонятно откуда взявшимися узлами сверху и снизу:
При этом, если не обрабатывать текстовые ноды, а выводить их напрямую, то этих лишних узлов там вообще нет:
Откуда они берутся и как сделать так, чтобы их не было. При этом обойтись без хаков по только их убиранию.