2008-09-17 18 views
5

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

<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 tiene este aspecto:

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

he que funcione de la manera que quiero en la que se agarra cada <bloque> en el página e inyecta sus contenidos en mi plantilla, sin embargo, está eliminando las etiquetas HTML dentro del bloque < >, devolviendo así lo siguiente sin el <p> o <span> etiquetas:

this is some rendered PHP! Main column of content 

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

Respuesta

9

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

Lo que me gustaría hacer para que un fragmento de HTML del árbol bajo el nodo $ es la siguiente:


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

HTML "fragmentos" son en realidad más problemática de lo que parece en un primer momento, ya que tienden a carecer cosas como doctypes y juegos de caracteres, lo que hace que sea difícil determinar de forma determinista ir y venir entre porciones de un árbol DOM y fragmentos de HTML.