2008-09-17 10 views
5

Je travaille sur un petit moteur de template, et j'utilise DOMDocument pour analyser les pages. Ma page de test afin ressemble beaucoup à ceci:PHP DOMDocument dépouillant les balises HTML

<block name="content"> 

    <?php echo 'this is some rendered PHP! <br />' ?> 

    <p>Main column of <span>content</span></p> 

</block> 

Et une partie de ma classe ressemble à ceci:

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

Je l'ai travailler la façon dont je veux en ce qu'elle attrape chaque <bloc> sur la la page et injecte son contenu dans mon modèle, cependant, il est dépouillant les balises HTML dans le bloc < >, revenant ainsi ce qui suit sans <p> ou < durée > tags:

this is some rendered PHP! Main column of content 

Qu'est-ce que je fais mal ici? :) Merci

Répondre

9

Rien: nodeValue est la concaténation de la partie valeur de l'arbre, et n'aura jamais de balises.

Ce que je ferais pour faire un fragment HTML de l'arbre sous le nœud $ est la suivante:


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

HTML « fragments » sont en réalité plus problématique que vous penseriez d'abord, parce qu'ils ont tendance à manquer des choses comme des doctypes et des jeux de caractères, ce qui rend difficile de faire des va-et-vient déterministes entre des parties d'un arbre DOM et des fragments HTML.

Questions connexes