Как получить HTML внутри $ узла, а не только $ nodeValue - PullRequest
13 голосов
/ 19 июля 2011

Описание текущей ситуации:

У меня есть папка, полная страниц (pages-folder), каждая страница в этой папке имеет (среди прочего) div с id="short-info".
У меня есть код, который извлекает все <div id="short-info">...</div> из этой папки и отображает текст внутри нее, используя textContent (что для этой цели такое же, как nodeValue)

Код, который загружает div:

<?php
$filename = glob("pages-folder/*.php");
sort($filename);
foreach ($filename as $filenamein) {
    $doc = new DOMDocument();
    $doc->loadHTMLFile($filenamein);
    $xpath = new DOMXpath($doc);
    $elements = $xpath->query("*//div[@id='short-info']");

        foreach ($elements as $element) {
            $nodes = $element->childNodes;
            foreach ($nodes as $node) {
                echo $node->textContent;
            }
        }
}
?>

Теперь проблема в том, что если у загружаемой страницы есть дочерний элемент, такой как изображение: <div id="short-info"> <img src="picture.jpg"> Hello world </div>, то результатом будет только Hello world , а не изображение, а затем Hello world .

Вопрос:

Как заставить код отображать полный html внутри div id = "short-info", включая, например, это изображение, а не только текст?

Ответы [ 2 ]

36 голосов
/ 19 июля 2011

Вы должны сделать недокументированный вызов на узле.

$node->c14n() Даст вам HTML, содержащийся в $node.

Сумасшедший, верно? Я потерял немного волос над этим.

http://php.net/manual/en/class.domnode.php#88441

Обновление

Это изменит HTML для соответствия строгому HTML. Лучше использовать

$html = $Node->ownerDocument->saveHTML( $Node );

Вместо.

2 голосов
/ 19 июля 2011

Вы хотели бы получить значение innerHTML, которое PHP напрямую не поддерживает. Один из способов решения этой проблемы - здесь в документации PHP.

Другой вариант - взять найденный вами $node, вставить его в качестве элемента верхнего уровня нового документа DOM, а затем вызвать saveHTML() для этого нового документа.

...