1

ある種の 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 タグを削除することもできましたが、これはかなりばかげているように思えます。そして、私はかなり確信しています、私はただ明白なことを見ていません...

ご提案ありがとうございます。

4

0 に答える 0