2012-07-30 61 views
2

在創建自動電子郵件時,需要用存儲的數據替換電子郵件的某些部分。PHP快速替換字符之間字符串的內容

例如。親愛的%first_name% %surname%,感謝您參加%place_name%

這可以用替換每個字符串的字符串來完成,但必須有更快的方法。

假設變量名稱與我們想要從系統中獲得的相同,例如。 %first_name%$user['first_name']等來代替....

回答

2

可以利用preg_replace_callback與數組值%的之間的替換鍵:

$fields = array('first_name' => 'Tim', 'place_name' => 'Canada'); 

$string = preg_replace_callback('/%(.+?)%/', function($arr) use($fields) 
{ 
    $key = $arr[1]; 
    return array_key_exists($key, $fields) ? $fields[$key] : $arr[0]; 
}, $string); 
+0

巧妙地利用封閉的,這需要PHP – Kristian 2012-07-30 16:12:20

+0

的新版本@Kristian:PHP 5.3,這是引入了匿名函數語法的版本,被釋放3年前。我不認爲它更新,我希望每個人都升級到至少該版本。 – 2012-07-30 16:16:15

+0

永遠不要低估代碼/版本要求的力量,以強制減慢升級的發生 – Kristian 2012-07-30 16:27:51

2

一個選項:

$vars = array(
    'firstname' = 'Bob', 
    'surname' = 'Dole', 
    'place' = 'Las Vegas', 
    // ... 
); 
extract($vars); 
include('my_template.phtml'); 

而且在my_template .phtml:

<?php 
echo <<<EOF 
    Dear $firstname $surname,<br> 
    Thank you for attending the Viagra and Plantains Expo in $place. 
EOF; 
?> 

I如果您在使用extract()時擔心名稱衝突,則可以始終使用EXTR_PREFIX_ALL選項或其他提取方法之一。

或者,更好的是,不要重新發明輪子。只需使用Smartymustache.php即可。

也看到這個問題:PHP template class with variables?

+0

+1這是我如何處理輸出視圖,並且我推薦它 – Kristian 2012-07-30 16:12:49

+0

@Kristian:是的,CakePHP以及可能還有很多其他框架/庫它通過這種方式,儘管通常具有其他功能,如輸出緩衝,並在Cake 2.0中查看塊和視圖繼承。 – 2012-07-30 16:33:44