Я работаю над небольшим шаблоном шаблонов, и я использую DOMDocument для анализа страниц. Моя тестовая страница выглядит так:
<block name="content"> <?php echo 'this is some rendered PHP! <br />' ?> <p>Main column of <span>content</span></p> </block>
И часть моего класса выглядит так:
private function parse($tag, $attr = 'name') { $strict = 0; /*** the array to return ***/ $out = array(); if($this->totalBlocks() > 0) { /*** a new dom object ***/ $dom = new domDocument; /*** discard white space ***/ $dom->preserveWhiteSpace = false; /*** load the html into the object ***/ if($strict==1) { $dom->loadXML($this->file_contents); } else { $dom->loadHTML($this->file_contents); } /*** the tag by its tag name ***/ $content = $dom->getElementsByTagname($tag); $i = 0; foreach ($content as $item) { /*** add node value to the out array ***/ $out[$i]['name'] = $item->getAttribute($attr); $out[$i]['value'] = $item->nodeValue; $i++; } } return $out; }
У меня он работает так, как я хочу, чтобы он захватывал каждый <блок> на странице и вводил его содержимое в мой шаблон, однако он лишает HTML-теги в <block>, тем самым возвращая следующее без <p> или <span>:
this is some rendered PHP! Main column of content
Что я здесь делаю неправильно? 🙂 Благодаря
Nothing: nodeValue – это конкатенация части значения дерева и никогда не будет иметь тегов.
Что я сделал бы, чтобы сделать HTML-фрагмент дерева в $ node, это:
$doc = new DOMDocument(); foreach($node->childNodes as $child) { $doc->appendChild($doc->importNode($child, true)); } return $doc->saveHTML();
HTML-фрагменты на самом деле более проблематичны, чем вы думаете вначале, потому что они, как правило, не имеют таких вещей, как доктрисы и наборы символов, что затрудняет детерминистский переход между частями дерева DOM и фрагментов HTML.