2

基本的なテンプレート エンジンを構築しようとしています。オープン ソースとして既に利用可能なテンプレート エンジンと同様に、検索と置換の手法を使用しています。

ただし、検索と置換はハードコーディングする必要があるため、それほど柔軟ではありません。私が言いたいのは、例として、私はこのようなものを使用しています

$templateMarkup = '<div class="title">{_TITLE_}</div>';
$renderedMarkup = str_replace("{_TITLE_}",$title,$templateMarkup);
echo $renderedMarkup;

ご覧のとおり、ハードコードされています。そのため、レンダリングを成功させるには、意図的にすべてのプレースホルダーを把握する必要があります。

私は正規表現が少し苦手です。{_しかし、最初から最後まですべてのテキストに一致し、それらの間の値を取得できる正規表現を開発できれば_}、柔軟なテンプレート エンジンを作成できるかもしれません。

正規表現について助けが必要です。

私が完全に間違った方法で達成している場合は、警告してください。

私が車輪を再発明していると思う人のために。これが私の説明です

Templating engines, that are already available are quite unnecessarily complex. 
My requirements are simple and so I am builidng my own simple engine. 

4

3 に答える 3

1

{_(\w+)_}テンプレートタグが単一の単語である場合、探している正規表現は です。次のように少し使用します。

<?php

$replacements = array(
    "firstname" => "John",
    "lastname" => "Smith"
);

$template_markup = "Hello {_firstname_} {_lastname_}";
if(preg_match_all('/{_(\w+)_}/', $template_markup, $matches)) {
    foreach($matches[1] as $m) {
        $template_markup = str_replace("{_".$m."_}", $replacements[$m], $template_markup);
    }
}
echo $template_markup;

?>

preg_match_all正規表現がスラッシュで囲まれているのがわかります。これらは区切り文字です。

更新:単一の単語を超えて正規表現を拡張する場合は、使用.して任意の文字に一致させるときに注意してください。他の文字を含めることを指定するには、次のようなものを使用することをお勧めします: {_([\w-_]+)_}. [\w-_]英数字、ハイフン、またはアンダースコアのいずれかに一致することを意味します。

(おそらく誰かが、使用が悪い考えである理由を説明できます.か?私は 100% 確信していません)。

于 2011-04-28T07:37:59.883 に答える
0

SamとJamesの両方が提供するソリューションを組み合わせて、新しいソリューションを作成しました。

  • Sam正規表現の部分をありがとう
  • Jamesアレイモードstr_replace()の部分に感謝します。

解決策は次のとおりです。

$replacements = array(
    "firstname" => "John",
    "lastname" => "Smith"
);

function getVal($val) {
    global $replacements;
    return $replacements[$val];
}

$template_markup = "Hello {_firstname_} {_lastname_}";
preg_match_all('/{_(\w+)_}/', $template_markup, $matches);
$rendered = str_replace($matches[0], array_map("getVal",array_values($matches[1])), $template_markup);
echo $rendered;
于 2011-04-28T10:23:13.680 に答える