2008-09-17 7 views
5

Ich arbeite an einer kleinen Templating-Engine, und ich verwende DOMDocument zum Parsen der Seiten. Meine Testseite sieht so weit wie folgt aus:PHP DOMDocument stripping HTML-Tags

<block name="content"> 

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

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

</block> 

und ein Teil meiner Klasse sieht wie folgt aus:

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

ich es habe arbeiten, wie ich in möchten, dass es jedes <Block> auf das packt Seite und injiziert seinen Inhalt in meine Vorlage, aber es streift die HTML-Tags innerhalb der <Block>, so dass folgende ohne die <p> oder <span> tags:

this is some rendered PHP! Main column of content 

Was mache ich hier falsch? :) Danke

Antwort

9

Nichts: nodeValue ist die Verkettung des Wertes Teil des Baumes, und wird nie Tags haben.

Was ich tun würde, ein HTML-Fragment des Baumes unter $ Knoten zu machen, ist dies:


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

HTML „Fragmente“ sind eigentlich problematischer als man zunächst denken würde, weil sie dazu neigen, fehlen Dinge wie Doctypes und Zeichensätze, die es schwierig machen, deterministisch zwischen Teilen eines DOM-Baums und HTML-Fragmenten hin und her zu gehen.