概要
PHPで正規表現書こうとすると、
ちょいちょい忘れているので、
preg_matchとかの使い方をメモする。
可視化サイト
正規表現によるマッチング(preg_match)
スタンダード
preg_match($pattern, $target_str, $array_result)
戻り値 |
---|
マッチが成功なら1 失敗なら0 エラーならFALSE |
マッチ結果が入る「$array_result」
array(
[0] => パターン全体のマッチ部分,
[1] => 1つめのキャプチャ,
[2] => 2つめのキャプチャ,
...
)
マッチ位置も一緒に取得
preg_match($pattern, $target_str, $array_result, PREG_OFFSET_CAPTURE)
マッチ結果が入る「$array_result」
array(
[0] => array(
[0] => パターン全体のマッチ部分
[1] => マッチングが判断された箇所の開始位置
),
[1] => array(
[0] => 1つめのキャプチャ
[1] => マッチングが判断された箇所の開始位置
),
[2] => array(
[0] => 2つめのキャプチャ
[1] => マッチングが判断された箇所の開始位置
),
...
)
マッチする全ての文字列を取り出し(preg_match_all)
スタンダード
preg_match_all($pattern, $target_str, $array_result)
戻り値 |
---|
マッチが成功ならマッチ回数 失敗なら0 エラーならFALSE |
マッチ結果が入る「$array_result」
array(
[0] => array(
[0] => パターン全体のマッチで、1回目のマッチ箇所
[1] => パターン全体のマッチで、2回目のマッチ箇所
...
),
[1] => array(
[0] => 1つめのキャプチャで、1回目のマッチ箇所
[1] => 1つめのキャプチャで、2回目のマッチ箇所
...
),
[2] => array(
[0] => 2つめのキャプチャで、1回目のマッチ箇所
[1] => 2つめのキャプチャで、2回目のマッチ箇所
...
),
...
)
結果の配列を変えた場合
preg_match_all($pattern, $target_str, $array_result, PREG_SET_ORDER)
マッチ結果が入る「$array_result」
array(
[0] => array(
[0] => パターン全体のマッチで、1回目のマッチ箇所
[1] => 1つめのキャプチャで、1回目のマッチ箇所
[2] => 2つめのキャプチャで、1回目のマッチ箇所
...
),
[1] => array(
[0] => パターン全体のマッチで、2回目のマッチ箇所
[1] => 1つめのキャプチャで、2回目のマッチ箇所
[2] => 2つめのキャプチャで、2回目のマッチ箇所
...
),
...
)
正規表現で置換(preg_replace)
preg_replace($pattern, $replace, $str)
例
//$strで指定した文字列に対し、$patternでキャプチャを指定し、$replaceでキャプチャの1番目を取得
preg_replace("/.*:\/\/(.*)/s", "\${1}", "http://www.google.co.jp");
パターンのはなし
正規表現箇所は以下の構成で表現される。
"/パターン/パターン修飾子"
パターン(モード)修飾子
修飾子 | 説明 |
---|---|
なし | 文字列の1行目のみ調べる |
i | 大文字と小文字の違いを無視する |
s | 改行文字を無視し、1行とみなして調べる |
u | 対象文字列をUTF-8として扱う |
e | 置換文字列をPHPコードとして実行 |
パターン
先頭、末尾
パターン | 説明 |
---|---|
^ | 後に続く文字を先頭とみなす( ^a ) |
$ | 前にある文字を末尾とみなす( a$ ) |
制御
パターン | 説明 |
---|---|
? | 最小マッチ |
※もうちょっと解説
最長一致の一致例
【文字列】
<h1>タイトルタイトル</h1>
【パターン】
<.+>
【結果】
<h1>タイトルタイトル</h1>
最短一致の一致例
【文字列】
<h1>タイトルタイトル</h1>
【パターン】
<.+?>
【結果】
<h1>
追加例
【文字列】
asasasasas
【パターン】
a.*?s
【結果】
as
※「.*?」は、次のsが来るまでの最小値ということになる。
繰り返し
パターン | 説明 |
---|---|
* | 前の文字を0個以上繰り返し( a* ) |
+ | 前の文字を1個以上繰り返し( a+ ) |
? | 前の文字が0個、もしくは1個( a? ) |
*? | 前の文字が0個以上かつ最小回数マッチ |
+? | 前の文字が1個以上かつ最小回数マッチ |
?? | 前の文字が0個、もしくは1個以上かつ最小回数マッチ |
{x,y} | 前の文字をx個~y個続き( a{1,3} ) |
{x} | 前の文字がx個続き( a{3} ) |
{x,} | 前の文字がx個以上続き( a{3,} ) |
任意の文字
パターン | 説明 |
---|---|
. | 任意の1文字( . ) |
(hoge) | 文字列単位で判別 |
(hoge | fuga) |
グループ
パターン | 説明 |
---|---|
[abc] | 括弧内の文字のいずれか1文字 |
[a-z] | 括弧内の範囲指定 |
[^a-z] | 括弧内の範囲指定を否定 |
キャプチャ
パターン | 説明 |
---|---|
() | 括弧内のパターンを1キャプチャとみなし、 配列戻り値の要素1以降に格納されたりする |
パターンの略記法
略記述 | 略前 | 説明 |
---|---|---|
\d | [0-9] | 数字 |
\D | [^0-9] | 数字以外 |
\w | [a-zA-Z0-9] | 単語の一部とみなされる文字 |
\W | [^a-zA-Z0-9] | 単語の一部ではない文字 |
\s | [\f\n\r\t\v] | 空白文字 |
\S | [^ \f\n\r\t\v] | 空白文字以外 |
メタ文字
メタ文字 | 説明 |
---|---|
\a | アラート |
\b | バックスペース |
\e | エスケープ |
\f | 改ページ |
\n | 改行 |
\r | 復帰 |
\t | 水平タブ(通常タブ) |
\v | 垂直タブ |
\0?? | 制御コード 8進数 |
\x?? | 制御コード 16進数 |