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 内部名意味
iPCRE_CASELESS大文字と小文字の区別をしない
mPCRE_MULTILINE文字列を複数行として扱う
「行頭」メタ文字 (^) および「行末」メタ文字 ($) を各行にも適用させる
sPCRE_DOTALL文字列を単一行として扱う
パターン中のドットメタ文字に改行を含める
xPCRE_EXTENDED エスケープするか 文字クラスの内部を除き、パターンの空白文字は無視される
文字クラスの外にあって、かつエスケープされていない # と次の改行文字の間の文字も無視される
複雑なパターンの内部に コメントを記述することが可能となる
この修飾子は、データ文字にのみ適用される
空白文字をパターンの特殊文字の並びの中、例えば条件付きサブパターン (?( の内部に置くことはできない
ePREG_REPLACE_EVALpreg_replace()のみ使用される修飾子
パターンにマッチした置き換え対象文字列を、preg_replace()の第2引数で指定したPHPコードで処理をして、その結果に置き換える
第2引数に渡されるとき単引用符や二重引用符、バックスラッシュおよび NULL 文字は バックスラッシュでエスケープされます
APCRE_ANCHORED 検索対象文字列の先頭でのみマッチするように制限される
(メタ文字『 ^ 』を指定するのと同じです)
DPCRE_DOLLAR_ENDONLY パターン内のメタ文字『 $ 』を改行文字の直前には適用させず、検索対象文字列の終わりにのみ適用させる
この修飾子は、m を設定している場合には無視される
S 追加のパターン分析を行う
あるパターンを複数回使用する場合に、マッチングにかかる時間を高速化することを目的として、パターンの分析に時間をかける
現在、パターン分析は、最初の文字が単一ではなく、かつ固定でないパターンに対してのみ有用です
UPCRE_UNGREEDY パターンに一致する文字列が、量指定子の指定の範囲でいくつかあるとき、最も長い文字列をとるか、最も短い文字列をとるかが変わります。
(パターンの貪欲さ)
つまり、量指定子は、デフォルトで貪欲でなく、疑問符を後ろに付けてはじめて貪欲になるようになります。 同様の設定は、(?U) 修飾子を パターン内で設定 するか、(.*? のように)量指定子の後に疑問符を 付けるかすることで行うこともできます
XPCRE_EXTRA パターン内で後ろに文字が続くバックスラッシュで特別な意味がないものは、 将来的な拡張の際の互換性の維持のため、エラーになります。 デフォルトでは、Perl のように文字が後ろに続くバックスラッシュ で特に意味がないものは、リテラルとして処理されます
JPCRE_INFO_JCHANGEDサブパターンで重複した名前を使用できるようにする
uPCRE_UTF8パターン文字列をUTF-8 エンコードされた文字列として扱う

メタ文字(meta-character)

メタ文字意味
\エスケープ文字
^検索対象の始まり
複数行モード(修飾子 m)では行の始まり
$検索対象の終わり
複数行モード(修飾子 m)では行の終わり
.改行を除くすべての文字にマッチ
修飾子 sを指定すると、改行を含む全ての文字
[文字クラス定義の開始
]文字クラス定義の終了
|選択枝の開始
(サブパターンの開始
)サブパターンの終了
?( の意味を拡張
0 または 1 回マッチ
なるべく少ない回数だけマッチ
(直前のパターン文字により意味が変わります)
*0 回以上の繰り返し
+1 回以上の繰り返し
{最小/最大を指定する量指定子の開始
}量指定子の終了

パターン中の角カッコで括まれた部分を「文字クラス」と言います。 文字クラスで使えるメタ文字は、次のものだけです。

\エスケープ文字
^クラスの否定(文字クラスの最初の文字に用いた場合のみ)
-文字の範囲の指定
]文字クラスの終了

スポンサーリンク

関連記事

スポンサーリンク

Math.pow

ホームページ製作・web系アプリ系の製作案件募集中です。

上に戻る