簡易テンプレート処理

「ようこそ{username}さん」の{username}を実際の名前に置き換えるような単純な文字列の置換のみ行う簡易テンプレート機能。

  • 複数の文字列の置換は、str_replaceやpreg_replaceという関数がある。
  • sprintfも使えないことはないのか?
  • PHPの文字列をダブルクォートで囲むと変数が展開されるけど、あれと同様の処理はできるのだろうか。→これは分からなかった。

ファイルを読んだ後、{username}を <?php echo $username; ?> に置換してPHPコードとして処理する方法もあるのかなと思ったが、eval()では<?php 〜 ?>の中に書く部分しか処理できないようだ。HTMLの中に<?php 〜 ?>が書いてあるような文字列はeval()では処理できない。PHPマニュアルのevalへのコメントに書いてあるように、evalを使う場合はpreg_replace_callback()を使う必要がある。


PHP: eval - Manual
http://jp2.php.net/manual/ja/function.eval.php

function eval_buffer($string) {
    // global $username; // eval内で必要な変数があればglobal宣言して使えるようにする。
    ob_start();
    eval("$string[2];");
    $ret = ob_get_contents();
    ob_end_clean();
    return $ret;
}

function eval_html($string) {
    return preg_replace_callback("/(<\?php|<\?)(.*?)\?>/si", "eval_buffer", $string);
}

そうでなければいったん一時ファイルに落とす?

$contents = file_get_contents("template.html");
// {keyword} を <?php echo $keyword; ?> に置換する。
$result = str_replace($keywords, $php_pieces, $contents);
file_put_contents("$$$$.php", $result);
include("$$$$.php");

結局、変に凝ったことをするよりも単に file_get_contents() して str_replace() するのが一番速いのかな?Smartyみたいに一時ファイルへキャッシュするなら一旦PHPコードにしておくという手もあるのだろうけど。