ある種の Wiki フォーマットは、ユーザーが HTML を避けるのを容易にします:**bold** oder //italic//
例えば。私が探しているのは、「. 例:
Replace **this** but do ''not touch **this**''
複数のステップでこれを行うのは非常に簡単です。
preg_match('/(''|**)(.*?)\\1/', ...
if ($match[0] === "''") {
// Do not touch, further replacements will follow
} else {
// Replace by HTML
}
PHP の preg_replace() 関数は、複数のパターンを置き換えるのに非常に効率的です。これは、パターン/置換に配列を使用する場合、1 回だけ呼び出して呼び出しのオーバーヘッドを回避できるためです。例:
preg_replace(
array(
'/\\*\\*(.*?)\\*\\*',
'/__(.*?)__/',
'/\\/\\/(.*?)\\/\\/'
),
array(
'<strong>\\1</strong>',
'<u>\\1</u>',
'<i>\\1</i>'
),
$s
)
ところで:この関数は、動的ページが作成されるたびに約100〜1000回呼び出されます。したがって、効率が必要です。
だから私の質問は次のとおりです:正規表現でマスキングをエンコードする方法はありますか + 後者の例のように preg_replace() で使用できる置換はありますか? もちろん、ネストされた書式設定は引き続き可能です。
ここで見つけたのは、ものを削除する方法です(正規表現パターン内の条件)が、これを問題に適用することはできません。置換により、不要な void タグペアが自然に残るためです。
preg_replace(
array(
'/(\'\'(.*?)\'\')|(__(.*?)__)/',
'/(\'\'(.*?)\'\')|(\\*\\*(.*?)\\*\\*)/',
'/\'\'(.*?)\'\'/'
),
array(
'\\1<u>\\4</u>',
'\\1<strong>\\4</strong>',
'\\1'
),
$s
);
// Leaves a void <u></u> and <strong></strong> for each masked section
注: '' は、最後の置換を除く各置換で存続する必要があります。そうしないと、セクションが早期にマスク解除されます。したがって、\1 の置換。
もちろん、最終的にすべての void タグを削除することもできましたが、これはかなりばかげているように思えます。そして、私はかなり確信しています、私はただ明白なことを見ていません...
ご提案ありがとうございます。