PHP DOM将HTML附加到现有文档而不使用DOMDocumentFragment :: appendXML

时间:2012-09-11 19:34:45

标签: php domdocument tidy

我需要将一些任意HTML加载到现有的DOMDocument树中。以前的答案建议使用DOMDocumentFragment及其appendXML方法来处理此问题。

正如@Owlvark在评论中指出的那样, xml不是html ,因此这不是一个好的解决方案。

我遇到的主要问题是像&ndash这样的实体导致错误,因为appendXML方法需要格式良好的XML。

我们可以定义实体,但这并不能解决并非所有html都是有效的xml的问题。

将HTML导入DOMDocument树有什么好方法?

1 个答案:

答案 0 :(得分:6)

我提出的解决方案是使用DomDocument::loadHtml作为@FrankFarmer建议,然后获取解析后的节点并将它们导入到我当前的文档中。我的实现看起来像这样

/**
* Parses HTML into DOMElements
* @param string $html the raw html to transform
* @param \DOMDocument $doc the document to import the nodes into
* @return array an array of DOMElements on success or an empty array on failure
*/
protected function htmlToDOM($html, $doc) {
     $html = '<div id="html-to-dom-input-wrapper">' . $html . '</div>';
     $hdoc = DOMDocument::loadHTML($html);
     $child_array = array();
     try {
         $children = $hdoc->getElementById('html-to-dom-input-wrapper')->childNodes;
         foreach($children as $child) {
             $child = $doc->importNode($child, true);
             array_push($child_array, $child);
         }
     } catch (Exception $ex) {
         error_log($ex->getMessage(), 0);
     }
     return $child_array;
 }