2013-06-11 51 views
0

嗨我正在写一些东西来处理我的意见,我需要一个preg_replace在这里,但我似乎无法得到它的工作,所以我废弃了代码。PHP Preg_replace占位符

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

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

而传递信息到函数是例如阵列

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

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

我也有通过preg_match_all结果循环的问题..

在此先感谢

回答

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}}匹配。使用?使+不情愿,所以它只匹配到第一个}而不是最后一个。

+0

我不认为非贪婪是有所作为的,'}'不是在'[a-z]'里面吗?我做了一个快速的JS演示,但它也应该适用于PHP:http://jsbin.com/ayugew/1/edit – elclanrs

+0

@elclanrs好点,没必要。我不确定他原来的问题究竟是什么;也许只是错误地使用'preg_match_all'。 –

+0

我解决了这个问题,但你的答案已被你接受。 –

1

......然而,这似乎只匹配一个对大括号。

你忘了逃跑第二{

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

在任何情况下,试试这个正则表达式,这是一个有点短:

/\{\{([^}]+)\}\}/ 
1

为什么不使用sprintf

$template = '%s is %d years old'; 
$vars = array('name' => 'John Doe', 'age' => 27); 
$output = sprintf($template, $vars['name'], $vars['age']); 
+0

理想情况下,想要避免必须创建该数组并根据模板内部的内容进行替换,本质上这是针对一种服务器端angular.js感谢您的输入。 –