PHPプログラミング

レシピ

文字列

正規表現で文字を検索する:preg_match関数

正規表現の関数を使って、文字列の中に特定の文字や単語が含まれていないかを確認します。

この記事のポイント

  • PHPの正規表現の基礎が分かる
  • preg_match関数の基本的な使い方を知る

目次

preg_match関数の基本的な使い方

PHPの正規表現による文字検索はpreg_match関数を使います。
この関数の基本的な使い方は次のようになります。

コード例

// 検索対象となる文字列
$str = 'my dog is very pretty. dog is really cute.';

// 正規表現で検索
if( preg_match( '/dog/', $str) )
	// マッチした時の処理
} else {
	// マッチしなかった時の処理
}

ここでは例として、検索の対象となる文字列を$strに格納しています。
この文字列に対して、特定の文字が含まれているかを確認していきます。

if文の条件式でpreg_match関数を使っていますが、今回は「dog」という文字が$strに含まれるかを確認しています。
含まれている場合にはtrueとなるので「// マッチした時の処理」が実行され、反対に含まれていない場合はfalseとなり「// マッチしなかった時の処理」を実行します。

preg_match関数には1つ目のパラメータに検索したい文字(dog)を指定し、2つ目のパラメータに検索対象となる文字($strの文字列)を渡すのが基本の形になります。
検索したい文字は「/ (半角スラッシュ)」で囲む必要があります。

また、正規表現では小文字や大文字の違いも厳密に区別するため、今回の検索したい単語を「Dog」や「DOG」など大文字に変更すると結果はfalseになります。

preg_match関数について詳しくは、php.netの下記ページをご覧ください。
preg_match関数 – php.net

先頭一致の検索をする

上記の例では文字列のどこに検索文字がある場合でもヒットしますが、文字列の先頭に特定の文字(単語)に対して検索をしたい場合は、「先頭一致」の検索を行います。

先頭一致の検索では、検索する文字の前に「^」を加えます。

コード例

// 検索対象となる文字列
$str = 'my dog is very pretty. dog is really cute.';

// 正規表現で検索
if( preg_match( '/^dog/', $str) ) {
	// マッチした時の処理
} else {
	// マッチしなかった時の処理
}

今回のコード例では「^dog」と指定して、「”dog“が先頭にあるか」という検索を行なっています。

しかし検索対象の文字列の先頭は「my」から始まるため、今回の検索は一致せずにfalseが返り値になります。
もし検索対象の文字列が「dog is very pretty.」と始まっていたらtrueです。

今回のように、検索文字に含める「^」などの記号は「メタ文字」と呼びます。

末尾一致の検索をする

先頭一致とは反対に、文字列の末尾に特定の文字が存在するかを検索することも可能です。
その場合は、検索したい文字の後ろに「$」をつけます。

コード例

// 検索対象となる文字列
$str = 'my dog is very pretty. dog is really cute.';

// 正規表現で検索
if( preg_match( '/dog$/', $str) ) {
	// マッチした時の処理
} else {
	// マッチしなかった時の処理
}

上記コードでは「my dog is very pretty. dog is really cute.」の末尾に「dog」があるかを確認しています。
文字列の末尾は「cute.」のため、「dog」と一致せずにfalseが返り値です。

完全一致の検索をする

先頭一致の「^」と、末尾一致の「$」を組み合わせることで完全に一致するか調べることも可能です。

コード例

// 検索対象となる文字列
$str = 'dog';

if( preg_match( '/^dog$/', $str) ) {
	// マッチした時の処理
} else {
	// マッチしなかった時の処理
}

メタ文字「^」と「$」が検索パラメータとして指定されているので、$strに入っている検索対象の文字列「dog」が検索文字と完全に一致するかを確認します。
上記コードでは完全に一致するため、trueが返り値です。

検索条件に「0回以上」の繰り返しを指定する

検索する文字に「0〜9の数字が0字以上ある」という条件を指定したい場合は、「* (半角アスタリスク)」を使います。
例えば、次のコード例では「ID」という文字に加えて、「0から9までの数字が0字以上」という条件を設定しています。

コード例

// 検索対象となる文字列
$str = 'ID1235019512';

if( preg_match( '/^ID[0-9]*$/', $str) ) {
	// マッチした時の処理
} else {
	// マッチしなかった時の処理
}

[0-9]」は「0〜9」という数字の範囲を指定しており、「0,1,2,3,4,5,6,7,8,9」のいずれかという条件指定になります。
この条件は「[0123456789]」と書くこともできますが、連続した数字であるため「 (ハイフン)」で省略も可能です。

その後に「*」が付いているため、検索条件は先述の通り「0から9までの数字が0字以上」になります。
そのため、「ID1」「ID456」「ID251989012」はいずれもtrueです。

また、「0字以上」なので「ID」のように数字がない場合についてもtrueになります。

検索条件に「1回以上」の繰り返しを指定する

続いて、最低でも1回以上は数字が登場するという条件を設定します。

コード例

// 検索対象となる文字列
$str = 'ID1235019512';

if( preg_match( '/^dog[0-9]+$/', $str) ) {
	// マッチした時の処理
} else {
	// マッチしなかった時の処理
}

数値の後ろに「+ (半角プラス)」というメタ文字を指定していますが、これが「1字以上続く」という条件指定になります。

*」の「0回以上」との違いは、例えば$strに入る文字列が「ID」のように後ろに数字が続かない場合に結果が異なります。
*」ではtrueとなり、今回の「+」ではfalseになります。

検索条件に「半角英数字を0字〜4字続く」と指定

ここまでの条件指定を踏まえて、「半角英数字が0回〜4回続く」という少し複雑な検索条件を指定してみましょう。

コード例

// 検索対象となる文字列
$str = 'dog123b';

if( preg_match( '/^dog[0-9a-zA-Z]{0,4}$/', $str) ) {
	// マッチした時の処理
} else {
	// マッチしなかった時の処理
}

こちらの条件式では「dog」という文字に加えて、英数字(大文字・小文字いずれも)が0回〜4回続くかどうかを調べる式になっています。
内訳としては「[0-9a-zA-Z]」が英数字の指定、その後ろの「{0,4}」が0回〜4回の条件指定です。

[0-9a-zA-Z]」は「-(ハイフン)」で途中を省略していますが、次の文字を全て対象としています。

0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z

これらの文字のいずれかが0字〜4字続いているかを判定します。

もし続く文字数を「2字以上、4字以内」としたい場合は「{2,4}」となり、「5字以上、7字以内」であれば「{5,7}」のように指定することで設定できます。

上記のコード例では、検索対象の文字が「dog」「dog61Bg」「dog9987」のいずれもtrueになります。
一方で、「dog61Bgb」のように「dog」の後ろに5字以上続くような場合についてはfalseが返ってきます。

検索する文字に記号を使う

検索する文字に記号を含めたい場合は、文字と同じように普通に記述すると文字として認識されません。
そのようなときは、記号の前に「\(バックスラッシュ)」をつけてエスケープすることで検索文字として指定することができます。

コード例

// 検索対象となる文字列
$str = 'dog*6Bb';

if( preg_match( '/dog\*/', $str) ) {
	// マッチした時の処理
} else {
	// マッチしなかった時の処理
}

上記のコード例では、記号である「*(半角アスタリスク)」をエスケープして検索文字として使用しています。

2つ以上の単語を検索する

検索したい単語を「|(パイプライン)」で区切ることで、2つ以上指定することができます。

コード例

// 検索対象となる文字列
$str = 'mouse and cat';

if( preg_match( '/dog|cat/', $str) ) {
	// マッチした時の処理
} else {
	// マッチしなかった時の処理
}

上記のコード例では、検索対象の文字列を「dog」「cat」のいずれかが含まれているか検証します。
$strに入っている文字列には「dog」はありませんが、「cat」はあるためtrueが返されます。

3つ以上の単語を指定する場合についても、同様に「|(パイプライン)」で区切ることで指定できます。

preg_match( '/dog|cat|fox|monkey/', $str);

様々な検索パターンに対応するために、今回ご紹介したもの以外にも多くのメタ文字が用意されています。
どんなものがあるか知りたい方は、下記ページで確認してみてください。
メタ文字 – php.net

こちらの記事は役に立ちましたか?

ありがとうございます。
もしよろしければ、あわせてフィードバックや要望などをご入力ください。

ありがとうございます。
コメントを送信しました。