0

次のような部分的な HTML フラグメントが与えられた場合

<div id="article">
    <p>Some text</p>
    <p>More text</p>
    <pre><code>
         echo $variable;
    </code></pre>
</div>

テキストノードをループしてそれらに関数を適用したいのですが、関数が何をするかは問題ではありませんが、プレコードブロックのテキストであるかどうかは問題ではありません。

部分的なコード ブロックであることを考えると、使用する必要があると思いますDOMDocument->createDocumentFragment()。しかし、デフォルトで行われているように、テキストノードをループして余分な<html>タグを作成せずに出力を保存するにはどうすればよいでしょうか?saveHTML()

4

2 に答える 2

1

ドキュメントフラグメントを使用できます。テキストノードをループするのは簡単ですが、見つけるのは少し難しいです。<pre>そのために、以下の例では、XPath クエリを使用して、要素の子孫ではないすべてのテキスト ノードを検索します。

$doc = new DOMDocument;
$xpath = new DOMXPath($doc);

$frag = $doc->createDocumentFragment();
$frag->appendXML(<<<'HTML'
<div id="article">
    <p>Some text</p>
    <p>More text</p>
    <pre><code>
         echo $variable;
    </code></pre>
</div>
HTML
);

$text_nodes = $xpath->query('descendant::text()[not(ancestor::pre)]', $frag);
foreach ($text_nodes as $text_node) {
    $text_node->data = strrev($text_node->data);
}

// Print the div
echo $doc->saveHTML($frag->firstChild);

これにより、次のようなものが出力されます。

<div id="article">    
<p>txet emoS</p>    
<p>txet eroM</p>    
<pre><code>
         echo $variable;
    </code></pre>
</div>

便利なリンク:

于 2013-06-17T20:25:23.433 に答える