2013-06-11 102 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感謝您的輸入。 –