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.