preservewhitespace parse domelement php

parse - php dom get element by id



PHP DOMDocument eliminando etiquetas HTML (1)

Estoy trabajando en un pequeño motor de plantillas, y estoy usando DOMDocument para analizar las páginas. Mi página de prueba hasta ahora se ve así:

<block name="content"> <?php echo ''this is some rendered PHP! <br />'' ?> <p>Main column of <span>content</span></p> </block>

Y parte de mi clase se ve así:

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; }

Lo tengo trabajando de la manera que quiero porque agarra cada <bloque> en la página e inyecta su contenido en mi plantilla, sin embargo, está eliminando las etiquetas HTML dentro del <bloque>, devolviendo así lo siguiente sin <p> o etiquetas <span>:

this is some rendered PHP! Main column of content

¿Qué estoy haciendo mal aquí? :) Gracias


Nada: nodeValue es la concatenación de la porción de valor del árbol y nunca tendrá etiquetas.

Lo que haría para hacer un fragmento de HTML del árbol bajo $ nodo es este:

$doc = new DOMDocument(); foreach($node->childNodes as $child) { $doc->appendChild($doc->importNode($child, true)); } return $doc->saveHTML();

Los "fragmentos" de HTML son en realidad más problemáticos de lo que creería al principio, ya que tienden a carecer de elementos como doctypes y juegos de caracteres, lo que hace que sea difícil ir y venir determinísticamente entre porciones de un árbol DOM y fragmentos HTML.