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);

その部分はFNAMEを「そこ」に置き換えるとうまく機能しますが、'-fallback="there"'与えられたものがない可能性があることを考慮に入れる必要があり、空でない場合は置き換える必要があり$customer->fnameます..おそらく、どれを見つける必要があります$1 として一致したパーソナライゼーションを次のように設定します。

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

また、fname、lname、cname などである可能性があることも考慮に入れる必要があります。

1 つの関数ですべてを実行しようとして問題が混乱するかどうかはわかりませんが、事実上、顧客ごとに関数が何度も実行されるため、最も効率的な方法が必要です。正規表現のヒーローは、これで正しい方向に私を向けることができますか? 私は正しい方向に進んでいると思いますが、最後の部分を理解することはできません...

ありがとう、

キリスト教徒

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 に答える