Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-电子邮件个性化字符串替换_Php_Regex_Preg Replace_Preg Match - Fatal编程技术网

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

PHP-电子邮件个性化字符串替换,php,regex,preg-replace,preg-match,Php,Regex,Preg Replace,Preg Match,我正在建立一个电子邮件个性化库,这样,像Mailchimp和Campaign Monitor这样的电子邮件发送者,你可以有一个特定的个性化设置,比如[FNAME],它将用客户名字替换字符串 如果我有如下文本: $source = 'Hello [FNAME-fallback="there"]'; 我要做的是将FNAME替换为$customer->FNAME(如果存在),否则将其替换为回退 困难在于,用户也可以在[FNAME]中输入,然后它应该在没有任何回退的情况下尝试替换,并显然删除[FNAM

我正在建立一个电子邮件个性化库,这样,像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);
这一部分可以很好地将FNAME替换为“there”,但我需要考虑到可能没有给定的
'-fallback=“there”
,如果它不是空的,我还需要将其替换为
$customer->FNAME
。。因此,我大概需要找到它匹配的个性化设置为$1,然后设置:

$replace = !empty($customer->fname) ? $customer->fname : '$1'
还需要考虑可能是fname、lname或cname等

我不确定我是否因为试图在一个函数中执行全部功能而混淆了问题,但实际上我需要最有效的方法,因为该函数将为每个客户反复运行。有哪个正则表达式英雄能用这个给我指出正确的方向吗?我想我走的路是对的,但我就是搞不懂最后一部分

谢谢


Christian

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

$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
中处理多个替换。我仍然认为一个模板引擎会更健壮,如果你需要进行修改,更容易维护。

代替编写你自己的模板引擎,你可以考虑使用一个比较成熟的模板引擎,比如上面需要的声音有点过火。我相信一定有一种表达方式与我上面的表达方式不太相符。。至少我希望如此!我不确定你能用正则表达式做到这一点-如果有人在一行上提供了多个替换参数,例如,如果源代码类似于“Hello[FNAME fallback=“first”][LNAME fallback=“last”]”,你会怎么做?我意识到模板化似乎有些过分,但它们是成熟的、已开发的解决方案,可以处理大多数用例。