0

嗨,我正在写一些东西来处理我的观点,我在这里需要一个 preg_replace,但我似乎无法让它工作,所以我已经废弃了代码。

我要替换的字符串是基于模板的动态字符串,例如

{{name}} is {{age}} years old

传递给函数的信息是一个数组,例如

array( 'name' => 'John Doe', 'age' => '27' );

然而,我到目前为止的模式\{{([a-zA-Z0-9]+)\}}似乎只匹配一对大括号。

我在 preg_match_all 中循环遍历结果时也遇到了问题。

提前致谢

4

3 回答 3

1

...但是这似乎只匹配一对大括号。

你忘了第二次逃跑{

/\{\{([a-zA-Z0-9]+)\}\}/
  -^-               -^-

无论如何,试试这个正则表达式,它有点短:

/\{\{([^}]+)\}\}/
于 2013-06-11T22:22:18.513 回答
1

preg_replace_callback似乎是一个不错的候选人。

$str = "{{name}} is {{age}} years old";
$values = array( 'name' => 'John Doe', 'age' => '27' );
echo preg_replace_callback("/\{{([a-z0-9]+?)\}}/i", function ($result)
use ($values) {
   if (isset($result[1])) {
      return $values[$result[1]];
   }
}, $str);

主要问题是{{[a-z]+}}将从{{name ... age}}. 使用 会?让人+不情愿,所以它只匹配第一个 }而不是最后一个。

于 2013-06-11T22:23:21.030 回答
1

你为什么不使用sprintf

$template = '%s is %d years old';
$vars = array('name' => 'John Doe', 'age' => 27);
$output = sprintf($template, $vars['name'], $vars['age']);
于 2013-06-11T22:26:48.623 回答