PHPのpreg_matchで正規表現によるマッチングする方法
プログラミング初心者向けにPHPのpreg_matchを使って正規表現によるパターンのマッチングをする方法について解説しています。正規表現を利用することで検索や置換の幅も広がるので、ぜひ使い方を覚えておきましょう。
テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日 調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名 調査手法:インターネット調査
今回は、preg_matchについて、テックアカデミーのメンター(現役エンジニア)が実際のコードを使用して初心者向けに解説します。
preg_matchを利用することで、文字列の検索や置換を行うことができます。
実務でも、preg_matchを利用した文字列の検索や置き換えを行う処理を実装するので、ぜひ学習してみてください。
目次
そもそもPHPについてよく分からないという方は、PHPとは何なのか解説した記事を読むとさらに理解が深まります。
preg_matchとは
preg_matchでは、ある文字列から正規表現で指定したパターンにマッチした文字列を検索できます。
パターンにマッチした場合は1を返し、マッチしなかったら0を返します。
例えば、検索対象の「これからphpを勉強します。」という文字列から、パターン「php」を検索すると1を返します。
一方、「ruby」を検索すると0を返します。
「php」の場合は文字列内にありますが、rubyはないのでこういった結果になります。
他にも大文字・小文字を区別せずにパターンにマッチさせることや、指定文字列が先頭にあるだけマッチさせることもできます。
正規表現とは
正規表現とは、文章中の特定文字を検索、置き換え、削除することができる文法です。
正規表現を利用する例として、文章中にある「,」という英文字のカンマを、「、」という日本語の読点に一括変換する場合などです。
その他にも、次のような使い方が可能です。
- 〇〇〇から始まる文字列を検索したい
- ×××で終わる文字列を▼▼▼に置き換えたい
- 大文字で始まる英単語を検索したい
- HTML内のcol-から始まり、そのあとは1~2桁の数字となっているコードを別のコードに置き換えたい
- 全角と半角、両方のスペースを削除したい
正規表現には非常に多くの指定方法があり、正規表現だけで1冊の本を書くことができるほど非常に深い内容です。
まずは、基本的な使い方を、サンプルコードを利用して使っていきましょう。
正規表現で指定したパターンにマッチするかどうかって少し難しいですね。
そうだね。簡単に言うと、ある形式にマッチしているかどうかってことなんだ。
ある形式とは何ですか?
例えばメールアドレスの形式になっているかどうかだったり、電話とか日付でもいいね。そういう単純には表せないものに使うんだよ。書き方を見てみよう!
[PR] PHPを学んで未経験からWebエンジニアを目指す方法とは
preg_matchの書き方
preg_matchの書式は以下の通りです。
[ ]はオプションで省略できます。
preg_match(/正規表現パターン/,検索対象の文字列,[配列],[動作フラグ],[検索開始位置])
返り値
preg_match関数の返り値は、パターンにマッチすれば1、マッチしなければ0です。
返り値の部分に変数を指定することで、パターンマッチの結果である1か0が代入されます。
正規表現パターン
「正規表現パターン」でマッチさせたいパターンを指定します。
正規表現は/で囲んで記述します。
検索対象の文字列
「検索対象の文字列」では、正規表現でマッチさせる対象文字列です。
配列
「配列」を指定した場合は、検索結果が配列として代入されます。
動作フラグ
「動作フラグ」で「PREG_OFFSET_CAPTURE」を指定すると、マッチした文字列の登場した位置(オフセット)をバイト数で取得できます。
検索開始位置
「検索開始位置」では、先頭ではなく検索を始めたい位置を指定できます。
ただし、指定はバイト数なので注意が必要です。
実際に書いてみよう
それでは実際に、preg_match関数を使用してPHPのプログラムを書いてみましょう。
文字列「PHP」を検索する
以下は、文字列「PHP」にマッチするか確認しています。
サンプルコード
<?php
if (preg_match("/PHP/", "今PHPを勉強しています。")) {
echo "マッチしました。";
} else {
echo "マッチしませんでした。";
}
出力結果
解説
<?phpでは、PHPプログラムを開始することを意味します。
if (preg_match(“/PHP/”, “今PHPを勉強しています。”)) {では、preg_matchを利用して、今PHPを勉強しています。という文字列からPHPという文字列がパターンマッチするかどうかを調査しています。
if文で、もし適合していたらという条件分岐を行っています。
echo “マッチしました。”;では、if文の条件に合致したら、マッチしました。と表示しています。
} else {では、if文の条件に合致しない場合の条件を指定しています。
echo “マッチしませんでした。”;では、if文の条件に合致しない場合、マッチしませんでした。と表示しています。
}ではif文の処理を終了します。
文字列「PHP」を大文字、小文字を区別せずに検索する
以下では、大文字・小文字の区別をせずにマッチするか確認しています。
これは、preg_matchの/正規表現パターン/の最後にアルファベットのiを記載することで、大文字、小文字を区別せずに検索します。
サンプルコード
<?php
if (preg_match("/PHP/i", "今phpを勉強しています。")) {
echo "マッチしました。";
} else {
echo "マッチしませんでした。";
}
出力結果
解説
<?phpでは、PHPプログラムを開始することを意味します。
if (preg_match(“/PHP/”, “今phpを勉強しています。”)) {では、preg_matchを利用して、今phpを勉強しています。という文字列からPHPという文字列がパターンマッチするかどうかを調査しています。
if文で、もし適合していたらという条件分岐を行っています。
echo “マッチしました。”;では、if文の条件に合致したら、マッチしました。と表示しています。
} else {では、if文の条件に合致しない場合の条件を指定しています。
echo “マッチしませんでした。”;では、if文の条件に合致しない場合、マッチしませんでした。と表示しています。
通常、大文字のPHPで文字列を検索し、検索対象にはphpという文字列の場合は、マッチしませんでした。と表示されます。
今回は、preg_matchの/正規表現パターン/の最後にアルファベットのiを記載することで、大文字、小文字を区別せずに検索しています。
最終的に、PHPという文字列を検索して、大文字小文字を区別しないため、phpという文字列が検索対象になり、マッチしました。と表示しています。
}ではif文の処理を終了します。
文字列「PHP」を検索し、登場位置も取得する
ここでは、文字列「PHP」を検索し、登場位置も取得する処理をします。
サンプルコード
<?php
if (preg_match("/PHP/", "今PHPを勉強しています。",$data,PREG_OFFSET_CAPTURE)) {
echo "マッチしました。";
} else {
echo "マッチしませんでした。";
}
print_r($data)
出力結果
解説
<?phpでは、PHPプログラムを開始することを意味します。
if (preg_match(“/PHP/”, “今PHPを勉強しています。”,$data,PREG_OFFSET_CAPTURE)) {では、if文で、もし適合していたらという条件分岐を行っています。
preg_matchを利用して、今PHPを勉強しています。という文字列からPHPという文字列がパターンマッチするかどうかを調査しています。
$dataでは、配列データとして$dataに検索結果を代入します。
PREG_OFFSET_CAPTUREでは、PREG_OFFSET_CAPTUREを指定することで、各マッチに対応する文字列のオフセットが返されます。
オフセットとは、基準値からどれぐらい離れているかを意味します。
今回、「今PHPを勉強しています。」という文字列の基準値は、最初にある「今」という文字の直前です。
「今」という文字は日本語文字で、2バイトの長さがあります。
つまり、「今PHP」という文字列の「PHP」という文字の始まりは3バイト目です。
最終的に、$data配列には、検索対象のPHPという値が最初のインデックスである、0番目の配列に格納されます。
オフセットである3バイトの3が、次のインデックスである1番目の配列に格納されます。
インデックスというのは、配列において値を代入する位置を指定している番号です。
echo “マッチしました。”;では、if文の条件に合致したら、マッチしました。と表示しています。
} else {では、if文の条件に合致しない場合の条件を指定しています。
echo “マッチしませんでした。”;では、if文の条件に合致しない場合、マッチしませんでした。と表示しています。
}ではif文の処理を終了します。
print_r($data)では、$dataに入っている配列を表示しています。
表示結果は次の通りです。
(
[0] => Array
(
[0] => PHP
[1] => 3
)
)
正規表現を使う関数
正規表現を使う関数には、次のようなものもあります。
- preg_quote()
- preg_match_all()
- preg_replace()
- preg_split()
- preg_last_error()
- preg_last_error_msg()
順番に紹介します。
preg_quote()
preg_quote($str, ‘/’)のようにして利用します。
preg_quote() では、str を引数として利用し、正規表現の特殊文字の前にバックスラッシュを挿入できます。
preg_quote() は、実行時に生成される文字列に、正規表現の特殊文字を含む場合のパターンマッチする場合に有効です。
preg_match_all()
preg_match_all($pattern,$subject,&$matches,$flags,$offset)という引数を利用して、繰り返しパターンマッチ処理を行えます。
preg_replace()
preg_replace($pattern, $replacement, $string);のようにして、$stringというデータに対し、$patternという正規表現パターンを利用して、 $replacementという置き換え後の文字列に変換できます。
preg_split()
preg_split ( パターン文字列 , パターンで区切る対象文字列[, 分割リミット数 = -1 [, フラグオプション = 0 ]] )のようにして、パターンマッチした文字列を区切ります。
PHPのsplit関数で文字列を分解して配列で返す方法 を参考にしてみてください。
preg_last_error()
preg_last_error()では、直近のPCRE 形式 正規表現処理のエラーコードを返します。
preg_last_error_msg()
preg_last_error_msg()では、最後に実行した PCRE 形式正規表現に関するエラーメッセージを返します。
おわりに
preg_matchで正規表現を使うと、様々な条件に一致させることができます。
今回の例以外に、郵便番号や電話番号にマッチさせることができます。
ぜひこの機会にpreg_matchで正規表現を使ってみましょう。
PHPの配列の基本を解説した記事も参考にしてみてください。
単純な文字列があるかどうか、の判定をしていますけど、PHPという文字列があるって、ちゃんと出てますねー。
文字列かあるかどうかっていう判定もできるんだ。本当は正規表現を使うものに対してpreg_match関数を使った方がいいんだ。
正規表現って難しそうですね。
簡単ではないよね。ただ、少しずつ慣れていけば大丈夫。とりあえずpreg_match関数があって、正規表現のパターンでマッチするかどうかを判断できるって覚えておけばいいよ。
PHPを学習中の方へ
これで解説は終了です、お疲れさまでした。
- つまずかず「効率的に」学びたい
- 副業や転職後の「現場で使える」知識やスキルを身につけたい
プログラミングを学習していて、このように思ったことはありませんか?
テックアカデミーのPHP/Laravelコースでは、第一線で活躍する「プロのエンジニア」が教えているので、効率的に実践的なスキルを完全オンラインでしっかり習得できます。
合格率10%の選考を通過した、選ばれたエンジニアの手厚いサポートを受けながら、PHP/Laravelを使ったWebアプリケーション開発を学べます。
まずは一度、無料体験で学習の悩みや今後のキャリアについて話してみて、「現役エンジニアから教わること」を実感してみてください。
時間がない方、深く知ってから体験してみたい方は、今スグ見られる説明動画から先に視聴することをおすすめします!