60行で作るPHP用テンプレートエンジン

Smarty でいいじゃん、という突っ込みはともかく、Dan さんがハッシュとのコンボとか書かれてたけど、PHP の preg_replace は複数のパターンを受け付けたりするのだよな。
だから、

function convert_string($s) {
    $s = preg_replace('/^<\?xml/', '<<?php ?>?xml', $s);
    $s = preg_replace('/#\{(.*?)\}/', '<?php echo $1; ?>', $s);
    $s = preg_replace('/%\{(.*?)\}/', '<?php echo htmlspecialchars($1); ?>', $s);
    return $s;
}

function convert_string($str) {
    $patterns = array(
        '/^<\?xml'     => '<<?php ?>?xml',
        '/#\{(.*?)\}/' => '<?php echo $1; ?>',
        '/%\{(.*?)\}/' => '<?php echo htmlspecialchars($1); ?>',
    );

    return preg_replace(array_keys($patterns), array_values($patterns), $str);
}

と書けたりする。ま、本当のところをいうと htmlspecialchars には ENT_QUOTES を指定したほうがいいから、以下のが良い。

function convert_string($str)
{
    $patterns = array(
        '/^<\?xml'     => '<<?php ?>?xml',
        '/#\{(.*?)\}/' => '<?php echo $1; ?>',
        '/%\{(.*?)\}/' => '<?php echo htmlspecialchars($1, ENT_QUOTES); ?>',
    );

    return preg_replace(array_keys($patterns), array_values($patterns), $str);
}

どうでもいいけど、まちゅさんのブックマークコメントが良く分からない。

2007年10月30日 kmachu php, template 変数の中に"#{foo}"という文字列が入っていたら表示が崩れる。 「convert_string("#{$value}")」とした時の$valueの中身が"#{hello}"とかね。まぁ割り切り。

んなこたぁ無いでしょうと思うのですが。