2

PHP では、テンプレートから HTML ページを生成し、特定の場所に変数を挿入してからディスクに保存する必要があります。

これまでのところ、このコードはうまく機能します:

<?php 

$client = "John doe";

$template = "

<html>
<body>
<div>
$client
</div>
</body>
</html>

";

$htmlCode = $template;

$fh = fopen("page.html", 'w') or die("can't open file");
fwrite($fh, $htmlCode);
fclose($fh);

?>

最終的には、次のようなものを使用して、ディスク上のファイルから $template を丸呑みして読み取りたいと考えています。

$template = file_get_contents("template.html");

しかし、このアプローチを使用すると、$client を "John doe" に置き換えることはできません。代わりに、ディスクに保存すると、HTML コードで $client として表示されます。

正規表現と printf を使用して部分文字列を置き換えることに関するいくつかの投稿を読みましたが、シナリオでそれらをどのように使用できるかわかりませんでした。私は、より簡単でより良い方法があるに違いないと確信しています。

多くの場所に多くの変数を配置する必要があるため、それぞれの正規表現を作成したくありません。$variable を外部 html ファイルのどこにでも貼り付けられるようにしたいだけで、PHP はそれを変数コンテンツ (存在する場合) に置き換える必要があります。残念ながら、 file_get_contents() は、解釈なしでそのまま文字列に丸呑みするだけです。インデントしたときに実際に動作する丸呑みに使用できる別の機能があるかどうか、私はさまよっていました。

どんな提案でも大歓迎です。

4

8 に答える 8

6

これは、 http://php.net/manual/en/function.ob-start.phpのサンプルコードと非常によく似ており、次のような場合に役立ちます。

<?php 
function save_callback($buffer) {
    // save buffer to disk
    $fh = fopen("page.html", 'w') or die("can't open file");
    fwrite($fh, $buffer);
    fclose($fh);
    return $buffer; // use it or ignore it
}
$client = "John doe";
ob_start("save_callback");
include("template.php");
ob_end_clean();
?>
于 2012-06-22T20:07:35.917 に答える
4

テンプレートファイルの読み取りでも同じことをしました。私のテンプレートは次のようになります。

<html>
<body>
<div>{client}</div>
</body>
</html>

次に、PHPコードは「{client}」を$clientに置き換えます。

$template = file_get_contents("template.html");
$contents = str_replace("{client}", $client, $template);

テンプレートで必要な区切り文字を使用します。 %client% [client] ?client? #client#

于 2012-06-22T20:05:36.650 に答える
0

この場合、純粋に英数字の変数名を一致させただけです。

echo preg_replace_callback("/[$][a-zA-Z0-9]+/", function($varname) {
    return $GLOBALS[substr($varname[0], 1)];
}, $input);
于 2012-06-22T20:13:44.200 に答える
0

簡単な正規表現を使用できます。

$out = preg_replace_callback("/\$([^\s]+)/",
    function($m) {
        if( isset($GLOBALS[$m[1]]))
            return $GLOBALS[$m[1]];
        else return $m[0];
    },
    $in);

これは非常に単純な正規表現であるため、完全ではありませんが、ほとんどの場合、必要なことが行われます。

個人的には、テンプレート化のために、{%keyword}より簡単に区切られる のようなものを使用します。

于 2012-06-22T19:52:29.200 に答える
-1

一重引用符を使用している場合、文字列と変数を混合しているphpでは:

   $name = "john";
   echo 'The Name is $name';
   // will output: The Name is $name

ただし、二重引用符を使用する場合:

    echo "The Name is $name";
    // will output: The Name is john
于 2012-06-22T19:51:39.317 に答える
-3

これは、変数を二重引用符で囲んでいるために発生すると思います。二重引用符内のすべての文字列は、コードに記述されているとおりに文字列に変換されます。

yousrs の例で、必要な結果を得るには、$template 変数を宣言するときに、次のように追加する値と連結する必要があります。

$template = "
<html>
<body>
<div>" . $client . "</div>
</body>
</html>
";

PHP では、ドットは文字列を連結します。

それでうまくいくはずです!:)

于 2012-06-22T19:58:05.413 に答える