正規表現
PHP では、「Perl 互換正規表現」 (PCRE / Perl Compatible Regular Expressions) を用いて正規表現が実装されている。
公式サイト:
Perl 互換正規表現 (PCRE) | PHP Manual [Official]
使い方
参考:
PHP の正規表現の基本的な使い方 | Web Design Leaves
書き方
参考:
メタ文字
\
:エスケープ文字^
:検索対象の先頭/複数行モードでは行頭$
:検索対象の終端/複数行モードでは行末.
:任意の一文字 (改行を除く)[]
:文字クラス|
:選択肢()
:サブパターンを定義する?
:0 または 1 回の合致*
:0 回以上の繰り返し+
:1 回以上の繰り返し{n,m}
:n 回以上 m 回以下の繰り返し
参考:
略記法
\d
:数字[0-9]
\D
:数字以外[^0-9]
\h
:水平スペース[ \t\xa0]
\H
:水平スペース以外\s
:スペース[ \t\r\n\v\xa0\x85]
\S
:スペース以外\v
:垂直スペース[\r\n\v\x85]
\V
:垂直スペース以外\w
:単語を構成する文字[_0-9A-Za-z]
\W
:単語を構成する文字以外[^_0-9A-Za-z]
参考:
よく使用される文字クラスの略記 | Let’s プログラミング
正規表現/PCRE 関数メタ文字や特殊記法 | ajisaba.net
オプション/修飾子/モード指定
i
:大文字小文字を区別しない (PCRE_CASELESS
)m
:改行を含む複数行に対してマッチを実行する (PCRE_MULTILINE
)x
:空白は無視されてコメントを記入できるモード (PCRE_EXTENDED
)
参考:
正規表現で使えるオプション/パターン修飾子まとめ | PisukeCode
PHP の正規表現 (preg系) のパターン修飾子 | You Look Too Cool
文字クラス
参考:
繰り返し/量指定子
参考:
文字をエスケープする
参考:
置換 (preg_replace)
正規表現に合致する文字列の置換を実行する。
参考:
preg_replace | PHP Manual [公式]
preg_replace_callback | PHP Manual [公式]
検索 (preg_match)
正規表現に合致する文字列の検索を実行する。
参考:
文字列を正規表現でマッチング検索をする preg_match / preg_match_all 関数の使い方 | トリオス
合致する文字列を全て検索する (preg_match_all)
フラグ
- PREG_PATTERN_ORDER:パターン順 (デフォルト)
- PREG_SET_ORDER:合致順
- PREG_OFFSET_CAPTURE:オフセット/バイト単位の合致位置を配列に含める
- PREG_UNMATCHED_AS_NULL:合致しなかったサブパターンを
NULL
で返す/このフラグを指定しなかった場合、空文字列を返す
参考:
PHP の正規表現で抽出した要素に任意のキーをつける | Unskilled?
preg_match_all | PHP Manual [公式]
preg_match_all() Function | W3Schools
分割 (preg_split)
境界のパターンを正規表現で指定して文字列を分割する。
$result = preg_split( '/[, ]+/', 'Hello, World' );
var_dump( $result );
Code language: PHP (php)
日本語を一文字ずつに分割する。
$result = preg_split(
'//u', '吾輩は猫である。名前はまだ無い。', -1,
PREG_SPLIT_NO_EMPTY
);
var_dump( $result );
Code language: PHP (php)
参考:
preg_split – 文字列を配列にする | ITSakura
PHP で日本語の文字列を一つずつ配列に格納する方法 | オノログ
PHP で日本語を1文字ずつ分解する方法 | You Look Too Cool
PHP で日本語を含む文字列を一文字ずつ配列に分割させる方法 | 動かざることバグの如し
preg_split の文字化けを回避する | 怪しい物を開発するブログ
preg_split – 正規表現で文字列を分割する | phpspot
マルチラインモード
パターンに修飾子として m
を指定すると、改行を含む複数行に渡ってパターンを探す。(PCRE_MULTILINE
)
preg_match( '/<p>([^<>]*)<\/p>/m', $text, $matches );
$content = $matches[1];
Code language: PHP (php)
参考:
改行を含めて、複数行でマッチングする方法 | WWW クリエイターズ
先読み/後読み/戻り読み
(?=pattern)
:先読み(?!pattern)
:否定先読み(?<=string)
:後読み (=戻り読み)(?<!string)
:否定後読み (=否定戻り読み)
参考:
文字列を含まない/否定の表現まとめ | WWW クリエイターズ
Unicode
Unicode 文字をコードポイントで指定するには、\x{...}
の形式で表記する。
\x{00a0}
:No-Break Space
参考:
PHP で漢字を表す正規表現 | You Look Too Cool
PCRE は Unicode 文字プロパティをサポートするとは限らない | hnw の日記
Unicode 文字プロパティ | PHP Manual [公式]
UTF-8
処理対象の文字列、あるいは、パターンが Unicode 文字を含んでいる場合は、パターンに u
修飾子を付与する。(PCRE_UTF8
)
参考:
preg 系で日本語を使う場合、パターン修飾子 u は不可欠 | すたら日記
PHP の preg_replace には u 修飾子をつけた方がいい | かたつむりくんの WWW
u (PCRE_UTF8) | PHP Manual [公式]
preg_replace with Unicode chars – Stack Overflow
preg_match and UTF-8 in PHP – Stack Overflow
Unicode 文字プロパティ
参考:
Unicode プロパティを用いた正規表現で日本語を抽出 | 株式会社シーポイントラボ
Unicode 文字プロパティ | PHP Manual [公式]
preg_replace_callback
正規表現に合致する度にコールバック関数を呼び出して処理を行う。
- 第1引数 (
$pattern
):正規表現で記述されたパターン - 第2引数 (
$callback
):コールバック関数 (関数名を文字列で指定するか、あるいは、無名関数を与える。) - 第3引数 (
$subject
):置換の対象とする文字列 - 第4引数 (
$limit = -1
):パターンを検索する最大回数を指定する。-1
を指定した場合は無制限に検索を実行する。(省略可能/デフォルト:-1
) - 第5引数 (
&$count = null
):合致した回数を格納する変数への参照 (省略可能/デフォルト:null
) - 第6引数 (
$frags = 0
):マッチ配列の形式を指定するフラグ (省略可能/デフォルト:0
)
参考:
preg_replace_callback | PHP Manual [公式]
mb_ereg_replace
マルチバイト文字列に対して正規表現による置換を行う。
参考:
preg_replace と mb_ereg_replace の違いと注意点 | Codaholic
mb_ereg_replace | PHP Manual [公式]
PCRE
「Perl 互換正規表現」 (PCRE / Perl Compatible Regular Expressions)
参考:
PCRE Pattern Specification | PCRE Documentation [Official]
まとめ/チートシート
Learn PCRE in Y Minutes | Learn X in Y minutes
PCRE Regular Expression Cheatsheet | Debuggex