PHPのpreg_matchの使い方!正規表現で含むか確認する!

PHP

PHPのpreg_match関数の使い方について書いています。

最初に、関数の概要と使い方を説明しています。
その後に、実際に使用したサンプルコードを3パターン載せています。

載せているサンプルコードは、PHPのバージョン8.1.4を使って、動作を検証しました。
PHPの公式ドキュメントはこちらです。

preg_match関数とは?

PHPでpreg_match関数を使用すると、指定した文字列の中に、正規表現にマッチする(合っている)文字が存在するか確認することができます。
よく使うパターンとしては、入力されたフォーマットが正しいかチェックするときなどに使用します。
郵便番号の入力形式が正しいか、電話番号の入力形式が正しいかなどです。

正規表現とは?

preg_match関数については、正規表現を知っていないと使うことができません。
正規表現は「文字列」を記号などを使用してパターンとして表現する方法です。

例えば、下記のように書いたりします。

.*apple.*

.*」で最初に何らかの文字が続いて、appleがあって、「.*」でさらに何らかの文字が続くということになります。
.」が任意の1文字を表していて、「*」が直前の文字を0回以上繰り返すという意味になります。

そのため、上記の正規表現は「テストapple!!」や「apple!!」、「apple」にマッチします。
文字列のどこかに「apple」があればマッチするという形になります。

preg_matchでは、正規表現で作ったパターンに文字列がマッチするかを確認します。
正規表現は、本が何冊も出ているくらい奥が深いものです。
そのため、正規表現の詳細については、今回は割愛いたします。

preg_match関数の使い方

preg_match関数はPHPの4〜8のバージョンで、標準関数として呼び出すことができます。
例えば、下記の例です。

<?php
$text = "りんごはappleです!";
$result = preg_match('/.*apple.*/', $text);

var_dump($result); // int(1)

$text変数に「りんごはappleです!」という検索対象の文字列を代入しました。
次の行でpreg_match関数を使っています。

第1引数に渡した正規表現に、第2引数の文字列がマッチする(合っている)かを確認します。
今回は、検索元文字列にappleが含まれているかを確認し、含まれています。

$result変数でpreg_match関数の結果を受け取っています。
正規表現にマッチした場合は1が返ってきて、マッチしない場合は0になります。

今回はマッチしたので、var_dump関数で出力すると1が返ってきていることが確認できました。

引数は?

preg_matchの引数は、下記のようになっています。
必須の引数は、第1引数と第2引数になります。

第1引数:正規表現のパターンを指定する。
第2引数:正規表現で検索したい文字列を指定する。
第3引数:省略可。マッチした文字列を格納するための配列を指定する。
第4引数:省略可。フラグを指定する(PREG_OFFSET_CAPTUREもしくはPREG_UNMATCHED_AS_NULL)、指定したフラグによって、マッチした時の第3引数(配列)の挙動が変わる。
第5引数:省略可。検索を初める文字位置を変更可能。デフォルトだと先頭(0番目)からになる。

返り値は?

検索元文字列に指定文字列がマッチした(合っていた)場合には、1が返ってきます。
マッチしない場合には0になります。失敗した場合にはfalseが返ってきます。

preg_match関数を使用したサンプルコード

preg_matchを使用したサンプルコードを3個載せています。

郵便番号のみで入力されているか

検索する文字列に郵便番号のみが入っているかを確認します。

$postCode = "151-0064";
$pattern = "/^\d{3}-\d{4}$/";

$result = preg_match($pattern, $postCode);
if ($result) {
    echo "郵便番号です。";
}

$postCode変数に郵便番号「151-0064」を代入しています。
$pattern変数には正規表現「^\d{3}-\d{4}$」を代入しています。
preg_match関数を呼び出して、正規表現($pattern)と郵便番号文字列($postCode)を渡しています。

正規表現で書いている内容です。
^」が文字列の先頭を表しています。
\d{3}」で任意の半角数字3文字になります。
その後にハイフンを書いて、さらに「\d{4}」で任意の半角数字4文字になるので、ハイフン付きの郵便番号を表していることになります。
$」は文字列の末尾です。

$postCode変数に入っているパターンに合うので、$result変数には1が返ってきて「郵便番号です。」が出力されて処理が終了します。

電話番号のみで入力されているか

検索する文字列に電話番号のみが入っているかを確認します。

$phoneNumber = "080-0000-0000";
$pattern = "/^\d{3}-\d{4}-\d{4}$/";

$result = preg_match($pattern, $phoneNumber);
if ($result) {
    echo "電話番号です。";
}

$phoneNumber変数に電話番号「080-0000-0000」を代入しています。
$pattern変数には正規表現「^\d{3}-\d{4}$-\d{4}$」を代入しています。
preg_match関数を呼び出して、正規表現($pattern)と電話番号文字列($phoneNumber)を渡しています。

正規表現の内容です。
先ほどの郵便番号と重複しますが「\d{3}」で任意の半角数字3文字になります。
あと二つの「\d{4}」をハイフンでつないでいるので、11桁でハイフン有りの電話番号表現になります。

先頭と末尾は「^」と「$」で表しています。
そのため、文字列の先頭から末尾まで、数値とハイフンで構成された11桁の電話番号以外はマッチしません。

$phoneNumber変数に入っている電話番号はパターンに合います。
$result変数には1が返ってきて「電話番号です。」が出力されて処理が終了します。

パスワードが半角英数字のみで入力されているか

最後に検索する文字列が半角英数字のみで入力されているかを確認します。
パスワードなどで使うことがあるかと思います。

$password = "Password123";
$pattern = "/^[0-9A-Za-z]+$/";

$result = preg_match($pattern, $password);
if ($result) {
    echo "パスワードは半角英数字です。";
}

$password変数に半角英数字でパスワード「Password123」を代入しています。
$pattern変数には正規表現「^[0-9A-Za-z]+$」を代入しています。
preg_match関数を呼び出して、正規表現($pattern)とパスワード文字列($password)を渡しています。

正規表現の内容です。
[0-9A-Za-z]」で半角数字「[0-9]」と英字大文字「A-Z」と英字小文字「a-z」を表しています。
[」と「]」の間に入っているので、どれかが入力されているとマッチします。
その後の「+」で、前述した半角英数字を1回以上繰り返すという意味になります。

先頭と末尾を「^」と「$」で表しています。
これで、文字列の先頭から末尾まで、半角英数字だったらマッチすることになります。

$password変数に入っているパスワードはパターンに合います。
$result変数には1が返ってきて「パスワードは半角英数字です。」が出力されて処理が終了します。

コメント

タイトルとURLをコピーしました