正規表現は文字列の検索とか置換に使われる表現ですが、もちろんPHPでも使用可能です。
そこでここではPHPでの正規表現の表し方や使い方についてまとめます。
また正規表現を使って検索・置換できる関数やデバッグに便利なツールも紹介
PHPでの正規表現の基本
PHPでの正規表現は文字列として表します。
そして文字列の中で // でパターンを囲むことで正規表現として関数に渡せます。
例えば次が正規表現の例
1 2 |
/** 正規表現の例 */ var pattern = '/\w+apple/'; |
上のコードだと '/\w+apple/' が正規表現のパターン
ただし文字列内なので特定の文字にはエスケープが必要です。
エスケープが必要な文字はあとで別に詳しく紹介します。
そして、正規表現では // の最後にiとかmとかのオプションも指定可能
例えば次は小文字と大文字を区別しないiオプションをつけた正規表現の例
1 2 |
/** オプション正規表現の例 */ var pattern = '/\\w+apple/i'; |
ちなみに利用可能なオプションについては次でまとめた通りです。
【PHP】正規表現で使えるオプション(パターン修飾子)まとめ
これらを使うことでより高度なマッチングも行えます。
そして正規表現が使える関数にパターンを渡すことで検索や置換が可能です。
例えば次はpreg_match関数にパターンを渡してテスト文字列を検索しているコード
1 2 3 4 5 6 7 8 9 |
/** 正規表現パターン */ $pattern = '/\w+aplle/'; /* テスト文字列 */ $text = 'pineaplle'; preg_match( $pattern, $text, $matches ); if( $matches ) print_r( $matches[0] ); /// => pineapple |
preg_match関数には1つめと2つめの引数にそれぞれパターン文字列と検索文字列を渡し、3つ目の引数に結果を保存する配列を渡すことで検索ができます。
以上がPHPでの正規表現の基本的な作り方
検索や置換系の関数では正規表現はこの書き方意外に受け付けられません。
正規表現でのエスケープについて
PHPではPCREというPerl5互換の正規表現を使っています。
なので細かな仕様の違いはあるもののPHPでも基本的な正規表現は全て使用可能です。
ただし注意するべき点は「PHPの正規表現は文字列中で定義されている」ということ
文字列中なので次の文字に関してはエスケープ処理が必要になります。
- スラッシュ
- バックスラッシュ
- その他特別な記号
これらの文字がエスケープが必要な理由とそのやり方は次の通り
スラッシュ文字のエスケープ
スラッシュ( / ) は次のようにパターンを囲むのに使われています。
1 |
$pattern = '/\w+apple/'; |
なので正規表現内で / はそのまま使えずエスケープが必要です。
例えばもしエスケープなしで次のようにそのまま書いてしまったとしましょう。
1 |
$pattern = '/km/h/'; |
そしてこのパターンをpreg_matchなどに渡してしまうと次のエラーが出てしまいます。
1 |
PHP Warning: preg_match(): Unknown modifier 'h' |
「PHP Warning」となっていますが、当然正しい正規表現ではありません。
なので正規表現では必ずスラッシュは \/ のようにエスケープ必須です。
1 |
$pattern = '/km\/h/'; |
このようにスラッシュに関してはエスケープしないとワーニングが出てしまうので要注意
バックスラッシュ記号
次に正規表現内で注意して使う必要があるのはバックスラッシュ( \ )です。
これはおなじみの \s とか \d とかのメタ文字を表す特別な記号なのでエスケープが必要
じゃあ \\ のように普通にエスケープすればOKかな?
と思ってしまいますが、スラッシュを \\ でエスケープするのはNGです。
1 |
'/C:\\.+\\.+/' |
例えば上の例だと正規表現的には /C:\.+\.+/ と解釈されてしまいます。
なぜなら \ は文字列中でもエスケープ記号を表しているからです。
なので正しく動作させるには \\\\ のように4つ重ねるのが正解
例えば次のように
1 |
'/C:\\\\.+\\\\.+/' |
上のコードだと正規表現的には /C:\\.+\\.+/ となるので正しくエスケープされます。
少しややっこしいですが、これは気を付けないとドツボにはまりそうです。
その他の記号
正規表現ではスラッシュとバックスラッシュ以外にも特別な意味を持つ記号が多くあります。
なのでそれらの記号もそれ自体を表すなら \ をつけてエスケープする必要あり
エスケープが必要なのは記号を表にすると次の通り
記号 | 正規表現中の記号の意味 |
. | 任意の1文字 |
+ | 直前文字の1回以上繰り返し |
* | 直前文字の0回以上繰り返し |
^ | 行の先頭 |
$ | 行の末尾 |
[ または ] | [ ]内のどれか1文字 |
( または ) | ()内を1文字として扱う |
{ または } | {n}で直前文字をn回繰り返し |
? | 後方一致や前方一致に使用 |
| | パターンを区切る |
- | [a-z]のようにデリミタ内で使用 |
これらの記号自体をマッチさせたいときはエスケープ必須なので要注意
正規表現のテストやデバッグに役立つツール
以上PHPの正規表現についてまとめてみました。
正規表現を紹介したついでに便利なツールを1つ紹介
例えば正規表現を使っていると
- 具体的な内部処理を見たい
- 無駄な処理がないか確かめたい
- コードに書く前にテストしたい
っていう風にテストやデバッグがしたくなることってありますよね?
そういう場合に便利なのが次の記事で紹介した regex101 というツールです。
正規表現を使うことがあるならブラウザ上でパパッとテストとかデバッグができるのでおススメ
特にステップごとにどういう処理がされているのか詳しく見れるのが便利です。
ここまでのまとめ
ということでPHPでの正規表現についてでした。
構文を学ぶのは少し手間がかかりますが、一度覚えればスマートに処理が書けます。
あとPHPだけじゃなくて他の言語でも応用が利くのも正規表現のいいところですね。
ではでは・△・)ノ バイバイ