PHP正規表現における特殊文字のエスケープ

特殊文字を文字そのものとして扱いたいとします。 そのためには、バックスラッシュを使用して エスケープする必要があります。 例を見てみましょう。

例

次の例では、正規表現の作成者は検索パターンを 文字 'a'、次にプラス記号 '+'、 次に文字 'x' としたかったのです。 しかし、コードの作成者は記号 '+' を エスケープしなかったため、実際の検索パターンは 文字 'a' が1回以上、その後 文字 'x' となっています:

php<?php
  $str = 'a+x ax aax aaax';
  $res = preg_replace('#a+x#', '!', $str);
?>

結果、変数には以下が書き込まれます:

php'a+x ! ! !'

例

ここでは、作成者はプラス記号をバックスラッシュで エスケープしました。 これで検索パターンは意図した通り、 文字 'a'、次にプラス記号 '+'、 次に文字 'x' となります。

php<?php
  $str = 'a+x ax aax aaax';
  $res = preg_replace('#a\+x#', '!', $str);
?>

結果、変数には以下が書き込まれます:

php'! ax aax aaax'

例

この例では、パターンは 文字 'a'、次にドット '.'、 次に文字 'x' のようになります:

php<?php
  $str = 'a.x abx azx';
  $res = preg_replace('#a\.x#', '!', $str);
?>

結果、変数には以下が書き込まれます:

php'! abx azx'

例

次の例では、作成者はスラッシュをエスケープするのを 忘れ、エスケープされていないドットは任意の文字を 表すため、すべての部分文字列が正規表現に マッチしてしまいました:

php<?php
  $str = 'a.x abx azx';
  $res = preg_replace('#a.x#', '!', $str);
?>

結果、変数には以下が書き込まれます:

php'! ! !'

例

ドットがそれ自体を表すべき場合にバックスラッシュを 忘れても、気づかない可能性があることに 注意してください:

php<?php
  preg_replace('#a.x#', '!', 'a.x'); // 期待通り '!' を返します
?>

見た目は正しく動作します(ドットが任意の文字、 つまり通常のドット '.' も表すためです)。 しかし、置換を行う文字列を変更すると、 エラーがわかります:

php<?php
  preg_replace('#a.x#', '!', 'a.x abx azx'); // '! ! !' を返しますが、期待は '! abx azx' でした
?>