IMO、最も簡単なのは、個々の変数を使用する代わりに、最初に配列内のテンプレート変数を収集することです。次に、配列全体を単純に に渡すことができますstr_replace
。
上記がオプションでない場合は、使用できます
例:
$a = 'foo';
$b = 'bar';
$c = 'baz';
$template = '{a} to the {b} to the {c}';
foreach (get_defined_vars() as $key => $val) {
if (is_scalar($val)) {
$template = str_replace('{' . $key . '}', $val, $template);
}
}
echo $template; // prints 'foo to the bar to the baz';
デモ
同じことを行う代替:
$a = 'foo';
$b = 'bar';
$c = 'baz';
$template = '{a} to the {b} to the {c}';
$scopeVars = array_filter(get_defined_vars(), 'is_scalar');
$templateMarker = preg_replace('/^.*$/', '{$0}', array_keys($scopeVars));
echo str_replace($templateMarker, $scopeVars, $template);
デモ
ただし、他の人にテンプレート内のテンプレート マーカーを提供させる場合、これは潜在的に安全ではないことに注意してください。現在の scope 内のget_defined_vars
すべての vars を取得するため、機密データを含む可能性のあるテンプレート値ではない変数を誰かが推測しようとする可能性があります。そのリスクを評価するのはあなた次第です。
また、スコープ変数がスカラー値を保持しているかどうかを確認するチェックを追加したことにも注意してください。これは、スコープ変数にオブジェクトまたは配列がある場合、PHP はそれらを .xml ファイル内の文字列に変換できないと文句を言うからstr_replace
です。