PHP正規表現における特殊文字のエスケープ
特殊文字を文字そのものとして扱いたいとします。 そのためには、バックスラッシュを使用して エスケープする必要があります。 例を見てみましょう。
例
次の例では、正規表現の作成者は検索パターンを
文字 'a'、次にプラス記号 '+'、
次に文字 'x' としたかったのです。
しかし、コードの作成者は記号 '+' を
エスケープしなかったため、実際の検索パターンは
文字 'a' が1回以上、その後
文字 'x' となっています:
<?php
$str = 'a+x ax aax aaax';
$res = preg_replace('#a+x#', '!', $str);
?>
結果、変数には以下が書き込まれます:
'a+x ! ! !'
例
ここでは、作成者はプラス記号をバックスラッシュで
エスケープしました。
これで検索パターンは意図した通り、
文字 'a'、次にプラス記号 '+'、
次に文字 'x' となります。
<?php
$str = 'a+x ax aax aaax';
$res = preg_replace('#a\+x#', '!', $str);
?>
結果、変数には以下が書き込まれます:
'! ax aax aaax'
例
この例では、パターンは
文字 'a'、次にドット '.'、
次に文字 'x' のようになります:
<?php
$str = 'a.x abx azx';
$res = preg_replace('#a\.x#', '!', $str);
?>
結果、変数には以下が書き込まれます:
'! abx azx'
例
次の例では、作成者はスラッシュをエスケープするのを 忘れ、エスケープされていないドットは任意の文字を 表すため、すべての部分文字列が正規表現に マッチしてしまいました:
<?php
$str = 'a.x abx azx';
$res = preg_replace('#a.x#', '!', $str);
?>
結果、変数には以下が書き込まれます:
'! ! !'
例
ドットがそれ自体を表すべき場合にバックスラッシュを 忘れても、気づかない可能性があることに 注意してください:
<?php
preg_replace('#a.x#', '!', 'a.x'); // 期待通り '!' を返します
?>
見た目は正しく動作します(ドットが任意の文字、
つまり通常のドット '.' も表すためです)。
しかし、置換を行う文字列を変更すると、
エラーがわかります:
<?php
preg_replace('#a.x#', '!', 'a.x abx azx'); // '! ! !' を返しますが、期待は '! abx azx' でした
?>