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);
演示
但请注意,当您让其他人在模板中提供模板标记时,这可能是不安全的。由于获得了当前范围内的get_defined_vars
所有变量,因此有人可能会尝试猜测不是模板值的变量,这些变量可能包含敏感数据。由您来评估该风险。
另请注意,我添加了检查范围变量是否包含标量值,因为如果范围变量中有对象或数组,PHP 将抱怨无法将它们转换为str_replace
.