PHP DOM получить значение узла html?(без зачистки меток) - PullRequest
21 голосов
/ 09 июня 2011

Я пытаюсь получить innerhtml тегов div в файле с помощью nodeValue, однако этот код выводит только простой текст и, похоже, удаляет все теги html изнутри div.Как я могу изменить этот код для вывода HTML-содержимого div, а не обычного текста, а также для вывода основного div-элемента, включая его дочерние элементы.

Пример:

содержимое файла file.txt:

<div class="1"><span class="test">text text text</span></div>
<div class="2"><span class="test">text text text</span></div>
<div class="3"><span class="test">text text text</span></div>

script.php:

  $file= file_get_contents('file.txt');

    $doc = new DOMDocument();

    @$doc->loadHTML('<?xml encoding="UTF-8">'.$file); 

    $entries = $doc->getElementsByTagName('div');

        for ($i=0;$i<$entries->length;$i++) {
            $entry = $entries->item($i);
            echo $entry->nodeValue;
        }

вывод: текст текст текст текст текст текст текст текст текст

что мне нужно для вывода:

<div class="1"><span class="test">text text text</span></div>
<div class="2"><span class="test">text text text</span></div>
<div class="3"><span class="test">text text text</span></div>

Обратите внимание, что родительский div (..etc) необходим для вывода, а также обертка тегов span ...

HELP!

Ответы [ 2 ]

30 голосов
/ 09 июня 2011

Я никогда не делал то, что вы пытаетесь сделать, но как удар в темноте, используя API документы, делает echo $ entry-> textContent;работа?

Добавление обновления.Это из комментариев на странице документов для DOMNode :

Привет!

Комбинируя все комментарии, самый простой способ получить внутренний HTML-код узла - использовать эту функцию:

<?php  function get_inner_html( $node ) { 
    $innerHTML= ''; 
    $children = $node->childNodes; 
    foreach ($children as $child) { 
        $innerHTML .= $child->ownerDocument->saveXML( $child ); 
    } 

    return $innerHTML;  }  ?>

Или, возможно, более простой метод - просто сделать:

echo $domDocument->saveXML($entry);
9 голосов
/ 29 ноября 2016

Вместо:

echo $entry->nodeValue;

Вы должны использовать:

echo $doc->saveXML($entry);

Вот более полный пример, который также может помочь другим, $doccontent - это HTML-блок какстрока:

$doccontent = '<html> …'; // your html string
$dom = new DOMDocument;
$internalErrors = libxml_use_internal_errors(true); // prevent error messages 
$content_utf = mb_convert_encoding($doccontent, 'HTML-ENTITIES', 'UTF-8'); // correct parsing of utf-8 chars
$dom->loadHTML($content_utf);
libxml_use_internal_errors($internalErrors); // prevent error messages 
$specialdiv = $dom->getElementById('xdiv');
if(isset($specialdiv))
{
    echo $dom->saveXML($specialdiv);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...