PHP - 电子邮件个性化字符串替换

时间:2012-10-10 18:32:16

标签: php regex preg-replace preg-match

我正在组建一个电子邮件个性化库,就像Mailchimp和Campaign Monitor这样的电子邮件邮件程序一样,你可以有一个个性化的说法[FNAME],它会用客户名字替换字符串。

如果我有以下文字:

$source = 'Hello [FNAME-fallback="there"]';

我想要做的是将FNAME替换为$customer->fname(如果存在),否则将其替换为后备。

困难在于,用户也可以输入[FNAME],然后它应该只是尝试替换而不会有任何后退,并且即使没有设置名字也显然会删除[FNAME]。

我已经达到了这个目标:

$personalisations = array(
    'FNAME',
    'LNAME',
    'CNAME'
);

$match  = '/\[(?:' . implode('|', $personalisations) . ')(?:\-[\s]*fallback=\")*(.{0,})\"\]/i';
$replace    = '$1';
$source     = 'Hello [FNAME-fallback="there"]';

$text   = preg_replace($match, $replace, $source);

该部分可以用'there'替换FNAME,但我需要考虑可能没有给出'-fallback="there"',如果是$customer->fname我也需要将其替换为$replace = !empty($customer->fname) ? $customer->fname : '$1' 不是空的..所以我想要找到它匹配的个性化为$ 1,然后设置:

{{1}}

还需要考虑它可能是fname,lname或cname等。

我不确定我是否因为尝试在一个功能中执行所有操作而感到困惑,但实际上我需要最有效的方法,因为该功能将为每个客户反复运行。任何正则表达式英雄都可以用这个指向我正确的方向吗?我想我走的是正确的方式,但我不能理解最后一部分......

谢谢,

基督教

1 个答案:

答案 0 :(得分:0)

如果您在模板外部的单独字段中提供默认值,则可以执行以下操作:

$personalisations = array(
    'FNAME',
    'LNAME',
    'CNAME'
);

$defaults = array(
    'FNAME' => 'first',
    'LNAME' => 'last',
    'CNAME' => 'class',
);

$match = array();
$replace = array();

for ($personalinations as $key) {
    $match[] = "/[$key]/";
    if (isset($customer->$key)) {
        $replace[] = $customer->$key;   
    } else { 
        $replace[] = $defaults[$key];
    }
}

$source     = 'Hello [FNAME-fallback="there"]';

$text = preg_replace($match, $replace, $source);

这应该在单个$source中处理多个替换。我仍然认为模板引擎会更加强大,如果你需要在线下进行更改,则更容易维护。