0

我正在整理一个电子邮件个性化库,因此对于 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。所以大概,我需要找到哪个它匹配为 $1 的个性化设置,然后设置:

$replace = !empty($customer->fname) ? $customer->fname : '$1'

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

我不确定我是否会因为尝试在一个函数中执行全部任务而混淆问题,但实际上我需要最有效的方法,因为该函数将为每个客户一遍又一遍地运行。任何正则表达式英雄都可以用这个为我指明正确的方向吗?我想我走对了,但我无法理解最后一部分......

谢谢,

基督教

4

1 回答 1

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. 我仍然认为模板引擎会更健壮,如果您需要进行更改,维护起来会更容易。

于 2012-10-10T21:19:15.613 回答