初心者でも簡単!PHP正規表現の基本と早見表・チェックツールを紹介

この記事の要点

  • 正規表現とは、文字列の規則性やパターンに当てはめてチェックする方法のこと
  • PHP正規表現には「preg_match」「preg_match_all」「preg_replace」などの関数がある
  • PHP正規表現にはシングルクオーテーションを使う
  • 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;\/?:\@&amp;=+\$,%#]+)/', '<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の開発をより効率的に行っていきましょう。