2

次のような PHP スニペットがあります ( snippet.php):

<?php 
    $some_param = some_function();
?>

<p>
    Text, bla bla bla... <?php echo $some_param ?> other text
    more text
</p>

これらのスニペットを次のようにロードします。

$html = file_get_contets('snippet.php');
$dom = new DOMDocument('1.0');
$dom->loadHTML($html);

xpath を使用して変更します。

$xpath = new DOMXPath($dom);
foreach ($xpath->query("//text()") as $q) {
    $str = trim($q->nodeValue);
    if (isset($strings[$str])) {
        $q->nodeValue = translate($str);
    }
}

このファイルを保存しようとすると問題が発生します。

$dom->save($out);

スニペット構造を完全に破壊します。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><head><?php
    $some_param = some_function();
??></head><body><p>
    Translated text, bla bla bla... &lt;?php echo $some_param ?&gt; other text
    more text
</p></body></html>

保存時に元のスニペット構造を復元するにはどうすればよいですか?

4

1 に答える 1

0

PHP スニペットは処理命令です。XPathを使用してクエリを実行できます。

//processing-instruction('php')

ノード テストtext()は、すべてのテキスト ノードに当てはまります。たとえばchild::text()、コンテキスト ノードのテキスト ノードの子を選択します。同様に、ノード テストcomment()はすべてのコメント ノードに対して真であり、ノード テストprocessing-instruction()はすべての処理命令に対して真です。processing-instruction()テストには、リテラルの引数が含まれる場合があります。この場合、リテラルの値と同じ名前を持つすべての処理命令に当てはまります。

それらをドキュメントに追加する方法は、で説明されています

于 2012-06-21T12:09:54.543 に答える