この記事の要点
- 正規表現とは、文字列の規則性やパターンに当てはめてチェックする方法のこと
- PHP正規表現には「preg_match」「preg_match_all」「preg_replace」などの関数がある
- PHP正規表現にはシングルクオーテーションを使う
- PHP正規表現は「デリミタ」「メタ文字」でパターンを指定する
以前、PHPの仕組みや学習方法についてご紹介していました。
今回は、システム開発で役に立つPHPの正規表現についてご紹介します。
開発を上で便利な正規表現ですが、「実はあまりよく分かっていない」という人も多いのではないでしょうか。
正規表現の使い方を理解すれば、フォームチェックなどを効率的に行うことができて便利です。
この記事では、初心者でも簡単にわかる正規表現の基本と、便利な早見表やチェックツールをご紹介します。
目次
正規表現の基本
まずは基本として、正規表現とは何なのか、どんなことができるのかをご説明します。
正規表現とは何か?
正規表現とは、ある文字列を規則性やパターンに当てはめてチェックする方法のことを指します。
たとえば、
- 電話番号
- 郵便番号
- メールアドレス
- URL
これらの文字列は一定の規則性を持っており、私たちはパッと見ただけで「これは電話番号」「これはURL」と認識できます。
規則性とは、上の例なら「携帯番号は半角数字で11桁」「URLはhttps://またはhttp://から始まる文字列」のようなもの。
人間は目視で簡単に行えますが、プログラムにはできません。
そこで、プログラムに規則性を認識させるため、正規表現という方法を利用するのです。
正規表現でどんなことができるのか
正規表現を利用すれば、文字列の規則性から以下のようなことが確認できます。
- 大文字か小文字か、数字か記号か
- 特定の数字や記号、文字が含まれているか
- 特定の文字から始まるか
正規表現は一見難しそうですが、慣れれば非常に便利な機能なので、積極的に利用していきましょう。
正規表現に使用する関数
PHPで正規表現のために用意されている関数「preg_match」「preg_match_all」「preg_replace」について見ていきましょう。
preg_match
正規表現の文字列検索で一般的に利用されるのが、preg_matchです。
検索対象を発見すると処理を終了するので、1回以上の検索結果は返ってきません。
例:郵便番号がパターンとマッチしているかを確認する
$str = "150-0022"; preg_match('/^[0-9]{3}-[0-9]{4}$/', $str, $matches); var_dump($matches);
結果:
array(1) { [0]=> string(8) "150-0022" }
詳細は公式マニュアルを参照してください。
https://www.php.net/manual/ja/function.preg-match.php
注意
preg_matchの戻り値は0か1ですが、処理に失敗した場合にfalseを返すこともあります。
厳密な判定が必要な場合は、 ===演算子を利用して戻り値がintかfalseかを明確にしましょう。
preg_match_all
preg_match_allは、preg_match同じく、文字列検索を正規表現で行う関数です。
preg_matchが検索対象を発見すると処理を終了するのに対し、preg_match_allは文字の最後まで検索を行います。
したがって、マッチ回数などを取得したい場合はpreg_matchではなくpreg_match_allを使います。
例:メールアドレスがパターンとマッチしているかを確認する
$str = "testmail@mail.com"; preg_match('/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/', $str, $matches); var_dump($matches);
結果:
array(5) { [0]=> string(17) "testmail@mail.com" [1]=> string(1) "l" [2]=> string(0) "" [3]=> string(1) "l" [4]=> string(4) ".com" }
詳細は公式マニュアルを参照してください。
https://www.php.net/manual/ja/function.preg-match-all.php
preg_replace
preg_matchおよびpreg_match_allは文字列を検索する機能でしたが、preg_replaceは文字列の置換を行う関数です。
よく似ているものとしてstr_replaceがありますが、正規表現を使える点が異なります。
例:URLがパターンとマッチしていた場合、Aタグを入れたURLに置換する
$str = "GoogleのURLはhttps://www.google.com/です。"; echo preg_replace('/https?(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)/', '<a href="$0">$0</a>', $str);
結果:
GoogleのURLは<a href="https://www.google.com/">https://www.google.com/</a>です。
詳細は公式マニュアルを参照してください。
https://www.php.net/manual/ja/function.preg-replace.php
PHPにおける正規表現の注意点
PHPには正規表現リテラルが規定されていません。そのため、正規表現を記述する際は、文字列として表現します。
PHPの文字列は、シングルクオーテーションとダブルクオーテーションどちらでも記述することができます。
しかし正規表現においては、あえてシングルクオーテーションを使うことをおススメします。
ダブルクオーテーションは変数を展開する仕組みを持っているため、意図しない挙動になる可能性があるためです。
PHPがサポートしている正規表現「POSIX拡張」と「PCRE」
PHPがサポートしている正規表現や文字コードについてご説明していきます。
PHPがサポートしている正規表現
PHPがサポートしている正規表現には、「POSIX拡張」と「PCRE」があります。
POSIXとは、UNIXでも使えるOSの標準規格です。POSIX拡張による正規表現は、セキュリティの問題からPHP5.3で非推奨となり、PHP7で削除されました。
PHP7や最新のPHP8では利用できないので、注意が必要です。
PCREは、Perl互換の正規表現ライブラリを指します。
PCRE関数はpreg_から始まり、POSIX拡張より文法の種類が豊富で動作も速いのが特徴です。
一般的にPHPでプログラミングを行う際は、PCREによる正規表現を使うことになります。
PCREで使える文字コード
PCREはUnicode文字プロパティをサポートしているため、利用できる文字コードはUTF-8に限られます。
最近ではPHPの開発はUTF-8で行われるのが一般的ですが、今でもASCIIやEUC-JPやSJISなどが用いられているところもあるので、使用する際は注意が必要です。
PCREの正規表現構文
PCREの正規表現は、「デリミタ」と「メタ文字」で表現されます。
デリミタ
デリミタとは、「ここからここまでが正規表現」と知らせるための区切り文字です。
PHPのデリミタには、英数字、バックスラッシュ、空白文字以外の任意の文字を指定することができます。
よく利用されるデリミタはスラッシュ (/)、 ハッシュ記号 (#) およびチルダ (~) です。
メタ文字
正規表現のパターンを表現するために使われるのが、メタ文字です。
メタ文字には、以下のようなものがあります。
^ $ . * + ? = ! : | \ / ( ) [ ] { }
正規表現早見表
正規表現を分かりやすく早見表にまとめました。なお、デリミタにはバックスラッシュを使用しています。
文字クラス
一般的な使い方の文字クラスです。
文字 | 説明 |
---|---|
/[aiueo]/ | a,i,u,e,oのいずれか1文字 |
/[^aiueo]/ | a,i,u,e,o以外のいずれか1文字 |
/[a-z]/ | アルファベット小文字aからzまでのいずれか1文字 |
/[A-Z]/ | アルファベット大文字AからZまでのいずれか1文字 |
/[0-9]/ | 0から9までのいずれか1文字 |
/[0-9a-zA-Z]/ | アルファベット、数字のいずれか1文字。順番は決まっていないので[a-zA-Z0-9][A-Za-z0-9]なども同じ意味 |
例:
・/ap[opq]le/ →apole/apple/apqleにマッチします。
・/test[1-5]/ →test1/test2/test3/test4/test5にマッチします。test[12345]と同じ意味です。
定義済み文字クラス
文字クラスの中でもよく使われる定義済み文字クラスです。
文字 | 説明 |
---|---|
/\d/ | 任意の数字。/[0-9]/と同じ意味 |
/\D/ | 数字以外の任意の文字。/[^0-9]/と同じ意味 |
/\s/ | 空白文字。/[\n\r \t]/と同じ意味 |
/\S/ | 空白文字以外の任意の文字。/[^\n\r \t]/と同じ意味 |
/\w/ | 任意の単語。/[0-9a-zA-Z]/と同じ意味 |
/\W/ | 単語以外の任意の文字。/[^0-9a-zA-Z]/と同じ意味 |
量指定子
繰り返し処理を定義する量指定子です。
文字 | 説明 |
---|---|
? | 0回か1回の出現 |
* | 0回以上の繰り返しの出現 |
+ | 1回以上の繰り返しの出現 |
{n} | n回の繰り返しの出現 |
{n,} | n回以上の繰り返しの出現 |
{n,m} | n回以上m回以下の繰り返しの出現 |
例:
・/orang?e/ →orane/orangeにマッチします。
・/\d{4,7}/ →4桁から7桁の数字にマッチします。
修飾子
末尾のデリミタの後に付ける修飾子です。
文字 | 説明 |
---|---|
i | 大文字・小文字を区別しない |
s | ピリオド(.)が改行(\n)にマッチ |
m | キャップ(^)とドル($)が改行(\n)の直前・直後にマッチ |
u | 文字コードをUTF-8として処理する |
例:
・/PHP/i →php/PHP/Php/pHPなどにマッチします。
その他のメタ文字
上記以外のメタ文字です。
文字 | 説明 |
---|---|
. | 改行(\n)以外の任意の1文字 |
^ | 文字列の先頭 |
$ | 文字列の末尾 |
| | 選択肢「OR」の意味 |
() | グループ化 |
\ | 直後のメタ文字をエスケープ |
例:
・/^google/ →googleで始まる文字列にマッチします。
正規表現チェックツール
実際の開発で正規表現が必要になったとき、「あれ?どうするんだっけ・・・?」と悩んでしまう人も多いことでしょう。
そんなときは、正規表現チェックツールを利用すると便利です。
正規表現チェックツールにはさまざまなものがありますが、一部をご紹介します。
PHP正規表現チェックツール
https://kinocolog.com/php_preg_match_tool/
PHPの正規表現でpreg_match、preg_match_all、preg_replaceを利用した実行結果が確認できます。
PHP: preg_match() / JavaScript: match() 正規表現チェッカー ver3.1
http://okumocchi.jp/php/re.php
PHPの preg_matchおよびJavaScriptのmatch関数の実行結果が確認できます。
まとめ
初心者でも簡単にわかる正規表現の基本と、便利な早見表やチェックツールについてご紹介しました。
正規表現は、システム開発の現場でとてもよく使われる機能です。
「なんとなく苦手・・・」と言わずに、この機会に積極的にマスターしておくことをおススメします。
早見表やチェックツールを適切に利用して、PHPの開発をより効率的に行っていきましょう。