我正在组建一个电子邮件个性化库,就像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等。
我不确定我是否因为尝试在一个功能中执行所有操作而感到困惑,但实际上我需要最有效的方法,因为该功能将为每个客户反复运行。任何正则表达式英雄都可以用这个指向我正确的方向吗?我想我走的是正确的方式,但我不能理解最后一部分......
谢谢,
基督教
答案 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
中处理多个替换。我仍然认为模板引擎会更加强大,如果你需要在线下进行更改,则更容易维护。