-1

我想使用一个模板文件,我在其中使用 {value} 作为标记来用一个值替换它。

该变量设置为 $order ,我想在有 {order} 的模板中替换它。

我想替换其中大约 50 个变量。

有没有办法自动做到这一点?

$text = file_get_contents("bol_files/order_template.txt");
    $text = str_replace("{ordernummer}",$bestelnummer, $text);
    $text = str_replace("{verzendwijze}",$verzendwijze, $text);
    echo $text;
4

3 回答 3

1

您可以使用strtr函数。

$text = file_get_contents("bol_files/order_template.txt");
$trans = array(
    '{ordernummer}' => $bestelnummer, 
    '{verzendwijze}'   => $verzendwijze,
    ......
);
echo strtr($text, $trans);

更新: 如果您的规则是固定的(替换{var_name}$var_name),那么您可以使用正则表达式替换。

echo preg_replace('/\{([^}]+)\}/e',  '${\'$1\'}' , $text );

检查示例。

加法:但是e不推荐使用标记(您可以preg_replace_callback改用,但那样的话,您需要将这些变量导入回调函数的范围),我认为您最好将数据保存在数组中而不是单独的变量中,甚至如果你可以使用get_defined_vars.

于 2012-09-02T09:28:21.013 回答
1

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.

于 2012-09-02T09:37:53.730 回答
0

str_replace 可以将数组作为参数:

$text = str_replace(array_keys($replaceArray), $replacearray, $text);

其中 $replaceArray 是一个关联数组

$replaceArray = (
  "{ordernummer}" => $bestelnummer,
  "{verzendwijze}" => $verzendwijze,
 and so on
);
于 2012-09-02T09:27:03.190 回答