PHP Dom не извлекает элемент

$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