2011-07-12 3 views
2

<bar>要素を持つDOMDocument内のすべての<foo>要素を置き換えようとしています。これを行う最善の方法は、getElementsByTagNameですべての<foo>要素を取得し、これらを置き換える新しい要素を作成することです。DOMNodeからinnerHTMLを取得する方法

問題は、置き換えられている要素からinnerHTMLを取得することができません。 nodeValueとtextContentはどちらも内部テキストを返しますが、内部タグは取り除かれます。どうすればDOMElementから "innerHTML"に類似したものを得ることができますか?

サンプルコード:

function convertTags($doc, $type) { 

$bad_nodes = $doc->getElementsByTagName($type); 

foreach($bad_nodes as $bad_node) { 
    $good_node = $doc->createElement("bar", $bad_node->nodeValue); 
    $bad_node->parentNode->replaceChild($good_node, $bad_node); 
} 

return $doc; 
} 
+0

なぜあなたは単に 'str_replace( ' kongr45gpen

+0

@ Kongr45pen:これは実際に正規表現でHTMLを解析することを意味するためです。 – jasso

答えて

3

私はあなたが実際のノードのようにそれらを処理することにより、やれることを考える:

$good_node = $doc->createElement('bar'); 
foreach($bad_node->childNodes as $kid) 
{ 
    $good_node->appendChild($kid); 
} 
+0

+1これ。とにかく文字列であれば、 '$ string。= $ doc-> saveHTML($ kid);' – Wrikken

+0

のようなもので 'appendNode'呼び出しを置き換えます。これは理論上はうまくいくようですが、実際にはすべてを追加しません$ bad_nodeの子の$最初の子ノードが追加されると、どうにかして残りの子要素へのチェーンが壊れているように見えます。したがって、$ good_nodeは、サブノードがたくさんある場合でも、(空の)ノードが1つ追加されます。 –

+0

これを+1しましたが、より詳細な検査の結果、 'appendNode()'は何ですか? 'appendChild()'(http://www.php.net/manual/en/domnode.appendchild.php)になっていますか? – LarsH

0

DOMDocument::saveHTML()メソッドを使用して、あなたがダンプしたいノードを指定します。私はあなたからHTMLを抽出するために探しているあなたの例では、ノードのかを理解した場合、何かしてみてください:

foreach($bad_nodes as $bad_node) { 
    $good_node = $doc->createElement("bar", $bad_node->nodeValue); 
    $bad_node->parentNode->replaceChild($good_node, $bad_node); 

    // Call saveHTML on the node you want to dump. 
    $doc->saveHTML($bad_node); 

} 
+0

返されたものは変更されませんでした。すべての正しいテキストが削除されていますが、すべてのタグが削除されています。私は、実際にはHTMLのw /タグなどを返さない$ doc-> createElement( "bar"、THIS_METHOD_RIGHT_HERE)と何か関係があると思います。 –

0

をあなたの代わりにあなたの良い要素にあなたの悪い要素のすべての子ノードを移動した場合はどうなりますか?これはinnerHTML型のメソッドを使わなければできないのですか?

私はsaveHTML()がそれを適用するノードのマークアップを返すべきだと思います。