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 の場合はもっとも長いものを結果とするのです。 - POSIX における "文字クラス" の定義は PCRE とは異なります。 シンプルな角括弧を使って明示的な文字にマッチさせるというのが PCRE の 文字クラス ですが、POSIX の照合順序や文字クラスや等価文字には対応していません。 最初と最後が
:
、.
あるいは=
で囲まれている文字クラスを PCRE で使うと、これらのサポートしていない機能を使うとして、コンパイルエラーが発生します。
POSIX | PCRE |
---|---|
ereg_replace() | preg_replace() |
ereg() | preg_match() |
eregi_replace() | preg_replace() |
eregi() | preg_match() |
split() | preg_split() |
spliti() | preg_split() |
sql_regcase() | No equivalent |