【问题标题】:php foreach replace variablesphp foreach 替换变量
【发布时间】:2012-09-02 09:23:33
【问题描述】:

我想使用一个模板文件,我在其中使用 {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;

【问题讨论】:

  • 我认为您可能需要使用preg_replace,它将所有出现的{blah} 替换为$blah
  • 不,preg_replace() 在这里是错误的想法
  • 能否请您重新查看答案并接受解决您的问题的答案或更新您的问题以解释为什么没有一个答案有助于解决您的问题,以便人们有机会更新他们的答案。谢谢。

标签: php foreach str-replace


【解决方案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 );

Check the example.

补充:e 标记已被弃用(您可以改用preg_replace_callback,但那样的话,您需要将这些变量导入到回调函数),我认为您最好将数据保存在数组中而不是单独的变量中,即使您可以使用get_defined_vars

【讨论】:

  • 谢谢 xdazz。只有有办法避免我需要在 dat trans 数组中键入所有 te 50 个变量吗?
  • @user1595774 检查我的更新,它会将{var_name} 替换为$var_name
  • /e 标记已被弃用,因为它会带来安全风险。它将从 PHP 中删除。见wiki.php.net/rfc/remove_preg_replace_eval_modifier
  • @Gordon 可以,但是如果使用preg_replace_callback,则需要将这些变量导入到回调函数的作用域中。
  • @xdazz 不错,是的,但至少这将在 PHP 的未来版本中起作用,而建议使用 \e 不会因为它很快就会被删除。
【解决方案2】:

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';

Demo

做同样事情的替代方案:

$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);

Demo

但请注意,当您让其他人在模板中提供模板标记时,这可能是不安全的。由于get_defined_vars 为您提供当前范围内的所有变量,因此有人可能会尝试猜测可能包含敏感数据的非模板值的变量。由您来评估该风险。

另外请注意,我添加了一个检查以查看作用域变量是否包含标量值,因为如果作用域变量中有对象或数组,PHP 将抱怨无法将它们转换为 str_replace 中的字符串。

【讨论】:

  • 对我来说没有安全问题。如何获取替换变量的完整字符串以回显到我的页面?
【解决方案3】:

str_replace 可以将数组作为参数:

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

其中 $replaceArray 是一个关联数组

$replaceArray = (
  "{ordernummer}" => $bestelnummer,
  "{verzendwijze}" => $verzendwijze,
 and so on
);

【讨论】:

    猜你喜欢
    • 2011-04-08
    • 2015-01-18
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    • 2017-01-05
    • 2011-04-23
    相关资源
    最近更新 更多