LoginSignup
99
109

More than 5 years have passed since last update.

PHP 正規表現 メモ

Last updated at Posted at 2017-06-26

概要

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進数
99
109
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
99
109