2012-07-30 58 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