Edited at

PHP 正規表現 メモ

More than 1 year has passed since last update.


概要

PHPで正規表現書こうとすると、

ちょいちょい忘れているので、

preg_matchとかの使い方をメモする。


可視化サイト

https://regexper.com/


正規表現によるマッチング(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進数