PHPの正規表現
PHPの正規表現には、ereg系の関数(POSIX拡張正規表現関数)と、Perl互換(PCRE)のpreg系の関数(Perl互換の正規表現関数)があります。
PCREとは、Perl Compatible Regular Expressionsの略です。
PCRE仕様書
PCREライブラリ
POSIX Regex 正規表現(POSIX 拡張) | |
---|---|
ereg_replace | 正規表現による置換を行う |
ereg | 正規表現によるマッチングを行う |
eregi_replace | 大文字小文字を区別せずに正規表現による置換を行う |
eregi | 大文字小文字を区別せずに正規表現によるマッチングを行う |
split | 正規表現により文字列を分割し、配列に格納する |
spliti | 大文字小文字を区別しない正規表現により文字列を分割し、配列に格納する |
sql_regcase | 大文字小文字を区別しないマッチングのための正規表現を作成する |
PCRE関数 正規表現(Perl 互換) | |
---|---|
preg_grep | パターンにマッチする配列の要素を返す |
preg_last_error | 直近の PCRE 正規表現処理のエラーコードを返す |
preg_match_all | 繰り返し正規表現検索を行う |
preg_match | 正規表現によるマッチングを行う |
preg_quote | 正規表現文字をクオートする |
preg_replace_callback | 正規表現検索を行い、コールバック関数を使用して置換を行う |
preg_replace | 正規表現検索および置換を行う |
preg_split | 正規表現で文字列を分割する |
Perl互換の正規表現構文を使用するpreg系の関数の 方が、多くの場合、ereg系の関数よりも速く動作します。
これ以降はPerl互換(PCRE)の話です。
正規表現の基本
基本はパターン文字列を『 / 』(スラッシュ)で囲い、必要であればその後に修飾子を付けます。この全体をパターン構文といいます。
/【パターン文字列】/ /【パターン文字列】/【修飾子】 例 /[0-9]+/ /[0-9]+/i
このスラッシュは、デリミタ(delimiter)といいます。
PHPでは英数字およびバックスラッシュ(\、¥) 以外のすべての文字をデミリタとして使用可能です。
Perl や Ruby でもデリミタは変更できますが、PHP のようにスラッシュとそれ以外が等価ではありません。
JavaScript ではデリミタはスラッシュ以外使用できません。
修飾子(Pattern Modifiers)
修飾子 | PCRE 内部名 | 意味 |
---|---|---|
i | PCRE_CASELESS | 大文字と小文字の区別をしない |
m | PCRE_MULTILINE | 文字列を複数行として扱う 「行頭」メタ文字 (^) および「行末」メタ文字 ($) を各行にも適用させる |
s | PCRE_DOTALL | 文字列を単一行として扱う パターン中のドットメタ文字に改行を含める |
x | PCRE_EXTENDED |
エスケープするか 文字クラスの内部を除き、パターンの空白文字は無視される 文字クラスの外にあって、かつエスケープされていない # と次の改行文字の間の文字も無視される 複雑なパターンの内部に コメントを記述することが可能となる この修飾子は、データ文字にのみ適用される 空白文字をパターンの特殊文字の並びの中、例えば条件付きサブパターン (?( の内部に置くことはできない |
e | PREG_REPLACE_EVAL | preg_replace()のみ使用される修飾子 パターンにマッチした置き換え対象文字列を、preg_replace()の第2引数で指定したPHPコードで処理をして、その結果に置き換える 第2引数に渡されるとき単引用符や二重引用符、バックスラッシュおよび NULL 文字は バックスラッシュでエスケープされます |
A | PCRE_ANCHORED |
検索対象文字列の先頭でのみマッチするように制限される (メタ文字『 ^ 』を指定するのと同じです) |
D | PCRE_DOLLAR_ENDONLY |
パターン内のメタ文字『 $ 』を改行文字の直前には適用させず、検索対象文字列の終わりにのみ適用させる この修飾子は、m を設定している場合には無視される |
S |
追加のパターン分析を行う あるパターンを複数回使用する場合に、マッチングにかかる時間を高速化することを目的として、パターンの分析に時間をかける 現在、パターン分析は、最初の文字が単一ではなく、かつ固定でないパターンに対してのみ有用です | |
U | PCRE_UNGREEDY |
パターンに一致する文字列が、量指定子の指定の範囲でいくつかあるとき、最も長い文字列をとるか、最も短い文字列をとるかが変わります。 (パターンの貪欲さ) つまり、量指定子は、デフォルトで貪欲でなく、疑問符を後ろに付けてはじめて貪欲になるようになります。 同様の設定は、(?U) 修飾子を パターン内で設定 するか、(.*? のように)量指定子の後に疑問符を 付けるかすることで行うこともできます |
X | PCRE_EXTRA | パターン内で後ろに文字が続くバックスラッシュで特別な意味がないものは、 将来的な拡張の際の互換性の維持のため、エラーになります。 デフォルトでは、Perl のように文字が後ろに続くバックスラッシュ で特に意味がないものは、リテラルとして処理されます |
J | PCRE_INFO_JCHANGED | サブパターンで重複した名前を使用できるようにする |
u | PCRE_UTF8 | パターン文字列をUTF-8 エンコードされた文字列として扱う |
メタ文字(meta-character)
メタ文字 | 意味 |
---|---|
\ | エスケープ文字 |
^ | 検索対象の始まり 複数行モード(修飾子 m)では行の始まり |
$ | 検索対象の終わり 複数行モード(修飾子 m)では行の終わり |
. | 改行を除くすべての文字にマッチ 修飾子 sを指定すると、改行を含む全ての文字 |
[ | 文字クラス定義の開始 |
] | 文字クラス定義の終了 |
| | 選択枝の開始 |
( | サブパターンの開始 |
) | サブパターンの終了 |
? | ( の意味を拡張 0 または 1 回マッチ なるべく少ない回数だけマッチ (直前のパターン文字により意味が変わります) |
* | 0 回以上の繰り返し |
+ | 1 回以上の繰り返し |
{ | 最小/最大を指定する量指定子の開始 |
} | 量指定子の終了 |
パターン中の角カッコで括まれた部分を「文字クラス」と言います。 文字クラスで使えるメタ文字は、次のものだけです。
\ | エスケープ文字 |
^ | クラスの否定(文字クラスの最初の文字に用いた場合のみ) |
- | 文字の範囲の指定 |
] | 文字クラスの終了 |
関連記事
- Smarty2をPHP7に対応させる方法(The /e modifier is no longer supported Smarty_Compiler.class.php, line 270)
- 全て携帯絵文字のみかどうかを調べる
- 携帯電話のメールアドレスか調べる
- 正しい電話番号か調べる
- 正しい郵便番号か調べる
- メールアドレスかどうか調べる
- 正しいURLかどうか調べる
- すべて漢字かどうか調べる
- すべてカタカナかどうか調べる
- すべて「ひらがな」かどうか調べる
スポンサーリンク