PHP Dom问题,如何在特定div中插入html代码

时间:2010-06-05 11:33:45

标签: php dom parsing replace

我正在尝试将$'resultsContainer'中的html代码替换为$ response的html。

我的代码不成功的结果是'resultsContainer'的内容仍然存在,并且$ response的html在屏幕上显示为文本而不是被解析为html。

最后,我想在'resultContainer'中注入$ response的内容而不必创建任何新的div,我需要这个:<div id='resultsContainer'>Html inside $response here...</div>而不是这个:<div id='resultsContainer'><div>Html inside $response here...</div></div>

   // Set Config
      libxml_use_internal_errors(true);   

      $doc = new DomDocument();
      $doc->strictErrorChecking = false;  
      $doc->validateOnParse = true;

      // load the html page
      $app = file_get_contents('index.php');

      $doc->loadHTML($app);

      // get the dynamic content
      $response = file_get_contents('search.php'.$query);
      $response = utf8_decode($response);         

      // add dynamic content to corresponding div
      $node = $doc->createElement('div', $response);
      $doc->getElementById('resultsContainer')->appendChild($node);


      // echo html snapshot
      echo $doc->saveHTML();

1 个答案:

答案 0 :(得分:1)

如果$ reponse是纯文本:

// add dynamic content to corresponding div
$node = $doc->createTextNode($response);
$doc->getElementById('resultsContainer')->appendChild($node);

如果它(可以)包含html(可以使用createDocumentFragment,但是它会为实体,dtd等创建自己的一组麻烦):

// add dynamic content to corresponding div
$frag = new DomDocument();
$frag->strictErrorChecking = false;  
$frag->validateOnParse = true;
$frag->loadHTML($response);
$target = $doc->getElementById('resultsContainer');
if(isset($target->childNodes) && $target->childNodes->length)){
    for($i = $target->childNodes->length -1; $i >= 0;$i--){
        $target->removeChild($target->childNodes->item($i));
    }
}
//if there's lots of content in $target, you might try this:
//$target->parentNode->replaceChild($target->cloneNode(false),$target);
foreach($frag->getElementsByTagName('body')->item(0)->childNodes as $node){
   $target->appendChild($doc->importNode($node,true));
}

这表明使用DOMDocuments作为模板引擎确实不适合(或至少很麻烦)。