1

ソフトウェアで送信される電子メールのカスタム フィールドを許可します。私は CKEditor を使用して、彼らが電子メールを作成およびフォーマットできるようにしています。カスタム フィールドを含む HTML 形式の電子メールの例は次のとおりです。

<p>%firstname% さん、こんにちは</p>

<p>何とか何とか.....</p>

次のコードを使用して、これらのフィールドを検出して置き換えます。

preg_match_all('`\%(?![0-9])([a-zA-Z0-9_-]+)\%`', $message, $contact_fields);
if (!empty($contact_fields[1])) {
    foreach($contact_fields[1] AS $contact_field) {
        $replace_width = 'do the magic here';
        $message = str_replace('%' . $contact_field . '%', $replace_with, $message);
    }
}

問題は、CKEditor がこれを行う場合があることです。

<p>%<span>名</span>%さん、こんにちは</p>

<p>何とか何とか.....</p>

したがって、フィールドを置き換えることにはなりません。私のユーザーは、なぜこれが HTML コードを表示できないのか疑問に思っています。

この正規表現を機能させて、カスタムフィールド内で他の HTML 属性が終了した場合でも、それを置き換える方法についての提案はありますか?

ありがとう

ベン

4

3 に答える 3

2

どうぞ:

\%(?![0-9])(?:<[^<]+?>)?([a-zA-Z0-9_-]+)(?:[\s]?<[^<]+?>)?\%

(?:<[^<]+?>)?キャプチャ グループの前後に追加しました。
(?:...)キャプチャ グループを作成せずに文字をグループ化し、<[^<]+?>html タグに一致させ、最後?にこれをオプションにします。したがって、これは、html タグが存在する場合と存在しない場合に一致します。
2番目の非キャプチャグループ[\s]?では、htmlタグに一致する前に挿入しました.あなたの例のように、との間に単一のスペースがfirstnameあり</span>ます.

例はここにあります: http://regexr.com?372fe

キャプチャ グループに html タグを含めたい場合は、ブラケットをシフトして、一致する大きなキャプチャ グループを作成します<tag>string</tag>

\%(?![0-9])((?:<[^<]+?>)?[a-zA-Z0-9_-]+(?:[\s]?<[^<]+?>)?)\%
于 2013-11-05T16:53:56.290 に答える
2

「AZ」ではなく「Az」が間違いだと思います。これを試して:

preg_match_all('`\%(?![0-9])([a-zA-Z0-9_-]+)\%`', $message, $contact_fields);
于 2013-11-05T17:13:51.323 に答える