$code = ' <h1>Galeria </h1> <div class="galeria"> <ul id="galeria_list"> <li> <img src="img.jpg" width="350" height="350" /> <br /> Teste </li> </ul> </div>'; $dom = new DOMDocument; $dom->validateOnParse = true; $dom->loadHTML($code); var_dump($dom->getElementById('galeria_list'));
var_dump
всегда возвращает NULL
. Кто-нибудь знает, почему? Я могу ясно видеть элемент с id galeria_list
в $code
. Почему это не получает элемент?
А также, знает ли кто-нибудь, как запретить domdocument добавлять теги <html>
и <body>
в метод saveHTML
?
благодаря
Похоже, что DOMDocument
не будет DOMDocument
работать с фрагментами HTML. Вы можете либо рассмотреть DOMDocumentFragment
(как предлагает dnagirl ), либо рассмотреть возможность расширения DOMDocument
.
После небольшого исследования я собрал простое расширение, которое позволит достичь того, о чем вы спрашиваете:
class MyDOMDocument extends DOMDocument { function getElementById($id) { //thanks to: http://www.php.net/manual/en/domdocument.getelementbyid.php#96500 $xpath = new DOMXPath($this); return $xpath->query("//*[@id='$id']")->item(0); } function output() { // thanks to: http://www.php.net/manual/en/domdocument.savehtml.php#85165 $output = preg_replace('/^<!DOCTYPE.+?>/', '', str_replace( array('<html>', '</html>', '<body>', '</body>'), array('', '', '', ''), $this->saveHTML())); return trim($output); } }
$dom = new MyDOMDocument(); $dom->loadHTML($code); var_dump($dom->getElementById("galeria_list")); echo $dom->output();
Похоже, loadhtml () не «прикрепляет» html dtd, который определяет id
как атрибут id для DOM. Но если html-документ содержит объявление DOCTYPE, он работает по назначению. (Но я думаю, вы не хотите добавлять doctype и html скелет, так или иначе :).
$code = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html><head><title>...</title></head> <body> <h1>Galeria </h1> <div class="galeria"> <ul id="galeria_list"> <li> <img src="img.jpg" width="350" height="350" /> <br /> Teste </li> </ul> </div> </body></html>'; $dom = new DOMDocument; $dom->loadhtml($code); var_dump($dom->getElementById('galeria_list'));
часть$code = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html><head><title>...</title></head> <body> <h1>Galeria </h1> <div class="galeria"> <ul id="galeria_list"> <li> <img src="img.jpg" width="350" height="350" /> <br /> Teste </li> </ul> </div> </body></html>'; $dom = new DOMDocument; $dom->loadhtml($code); var_dump($dom->getElementById('galeria_list'));
Вы можете рассматривать DOMDocumentFragment, а не DOMDocument, если вы не хотите заголовки.
Что касается проблемы с идентификатором, это из руководства :
<?php $doc = new DomDocument; // We need to validate our document before refering to the id $doc->validateOnParse = true; $doc->Load('book.xml'); echo "The element whose id is books is: " . $doc->getElementById('books')->tagName . "\n"; ?>
Вероятно, validateOnParse
.
Кто-то работал над этой проблемой в руководстве PHP, используя XPath: http://us3.php.net/manual/en/domdocument.getelementbyid.php#96500