POSIX 正規表現との違い
PHP 5.3.0 以降、POSIX 正規表現
拡張モジュールは非推奨となりました。POSIX の正規表現と
PCRE の正規表現にはさまざまな違いがあります。
このページでは、PCRE への移行の際に知っておくべきもっとも重要な違いをまとめます。
-
PCRE 関数では、パターンを デリミタ で囲まなければなりません。
-
POSIX とは異なり、PCRE 拡張モジュールには大文字小文字を区別しないマッチング専用の関数がありません。
同等の機能は、i (PCRE_CASELESS) パターン修飾子
でサポートしています。それ以外にもパターン修飾子がいくつかあり、
マッチングの振る舞いを変えることができます。
-
POSIX 関数は、いちばん左側にある最も長くマッチするパターンを探します。
しかし PCRE は、マッチするパターンが最初に見つかった時点で処理を終えます。
マッチするパターンがまったくない文字列の場合は何も相違はありませんが、
マッチするパターンがある場合は結果や処理速度に大きな影響が出る可能性があります。
この違いを説明するために、Jeffrey Friedl の
"Mastering Regular Expressions (「詳説 正規表現」)" にある以下の例を考えてみましょう。
PCRE でパターン
one(self)?(selfsufficient)? を文字列
oneselfsufficient に適用すると
oneself にマッチしますが、
POSIX の場合は文字列全体 oneselfsufficient にマッチします。
どちらの結果も元の文字列にマッチしますが、POSIX の場合はもっとも長いものを結果とするのです。