Я работаю над небольшим движком шаблонов и использую 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;
}
У меня он работает так, как я хочу: он захватывает каждый <block> на странице и вставляет его содержимое в мой шаблон, однако он удаляет HTML-теги внутри <block>, тем самым возвращая следующее без <p> или теги <span>:
this is some rendered PHP! Main column of content
Что я здесь делаю не так? :) Спасибо






Ничего: nodeValue является объединением части значения дерева и никогда не будет иметь тегов.
Что я бы сделал, чтобы сделать HTML-фрагмент дерева под $ node, так это:
$doc = new DOMDocument();
foreach($node->childNodes as $child) {
$doc->appendChild($doc->importNode($child, true));
}
return $doc->saveHTML();
«Фрагменты» HTML на самом деле более проблематичны, чем вы думаете на первый взгляд, потому что им не хватает таких вещей, как типы документа и наборы символов, что затрудняет детерминированный переход между частями дерева DOM и фрагментами HTML.