DOM XMLでHTMLの一部だけを入力して一部だけ出力したい
という悩み。テンプレートとかを使っていると、完全でないHTMLを使いたくなる。
そこでDOMDocument::loadHTMLをして、saveXML(node)とするとnodeの部分が出力されるがHTML内のコメントアウトがCDATAになってしまう。(このせいでFirefoxでscriptタグが読めずJavascriptエラーが出てしまう。)
saveHTMLをするとhtmlとかbodyとかタグが補完されてしまっているので意味がない。
なのでどーするかというと
$html = file_get_contents(XXXX); $doc = new DOMDocument('1.0', 'UTF-8'); $doc->loadHTML($html); $newDoc = new DOMDocument(); foreach( $doc->getElementsByTagName("body")->item(0)->childNodes as $node ){ $newDoc->appendChild( $newDoc->importNode($node, true) ); } echo $newDoc->saveHTML();
新しいDOMDocumentを作って中身をコピーしたら出来た。
もっといい方法があれば、知りたいなと思うが、出来たからとりあえずいいかな。
※[]などの一部記号がURLエンコードされていたので出力時にURLエンコードをかけてもいいかもしれない