【问题标题】:Php - Dom, Insert HTML_CODE inside nodeValuePhp - Dom,在 nodeValue 中插入 HTML_CODE
【发布时间】:2011-11-12 07:18:48
【问题描述】:
  $dom= new DOMDocument('1.0', 'iso-8859-1');
  $dom->loadHTML(' <html><body> <strong>SECOND</strong> </body></html>');

  $path = new DOMXPath($dom);

  foreach($path->query('body') as $found){
      $found->nodeValue  = ' <strong>FIRST</strong> '.$found->nodeValue;
  }

var_dump($dom->saveHTML()); //It shows <strong> as "&lt;strong&gt;"

本示例中的“强”标签将转换为文本。 实际上我需要在那里添加一个大的 HTML 代码。而且它的格式不是很好,稍后会修复。

我该怎么做?

【问题讨论】:

    标签: php dom domdocument domxpath nodevalue


    【解决方案1】:

    为了添加 XML 的新部分,您需要以某种方式从它们中创建 DOM 节点,而不是使用纯文本。

    您可以尝试使用 DOMDocument 片段:http://www.php.net/manual/en/domdocumentfragment.appendxml.php

    或者,正如它在该页面上所建议的那样,创建一个额外的 DOMDocument 对象并循环遍历节点以将它们添加到您的原始 DOMDocument 中。

    【讨论】:

      【解决方案2】:

      只需使用createCDATASection函数:$found-&gt;appendChild($dom-&gt;createCDATASection ( ' &lt;strong&gt;FIRST&lt;/strong&gt; '.$found-&gt;nodeValue ));

      【讨论】:

        【解决方案3】:

        来自这个类似的问题:How to insert HTML to PHP DOMNode?

        1) 创建辅助函数:

        private static function __appendHTML($parent, $rawHtml) {
           $tmpDoc = new DOMDocument();
           $tmpDoc->loadHTML($rawHtml);
           foreach ($tmpDoc->getElementsByTagName('body')->item(0)->childNodes as $node) {
               $importedNode = $parent->ownerDocument->importNode($node, TRUE); 
               $parent->appendChild($importedNode);
           }
        }
        

        2) 使用 helper 将原始 html 插入到元素中:

        $elem = $domDocument->createElement('div');
        appendHTML($elem, '<h1>Hello world</h1>');
        

        【讨论】:

        • 请标记为重复,而不是发布只是指向 Stack Overflow 上另一个问题的链接的答案。
        【解决方案4】:
        $first = new DOMElement('strong', 'first');
        $path  = new DOMXPath($dom);
        
        foreach($path->query('body') as $found)
        {
          $found->insertBefore($first);
        }
        

        【讨论】: