6

任意の HTML を既存のDOMDocumentツリーにロードする必要があります。DOMDocumentFragment以前の回答では、これを処理するための使用とそのappendXML方法が提案されています。

@Owlvarkがコメントで示しているように、xml は htmlではないため、これは適切な解決策ではありません。

私が抱えていた主な問題は、メソッドが適切な形式の XML を想定している&ndashため、次のようなエンティティがエラーを引き起こしていることでした。appendXML

エンティティを定義することはできますが、これではすべての html が有効な xml ではないという問題に対処できません。

DOMDocumentHTML をツリーにインポートするための適切なソリューションは何ですか?

4

1 に答える 1

7

私が思いついた解決策は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;
 }
于 2012-09-11T20:49:34.730 に答える