PHPプログラミング

レシピ

文字列

正規表現を使った文字列の検索

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

この記事のポイント

  • PHPの正規表現の基礎が分かる
  • 正規表現でよく使う「preg_match関数」の基本的な使い方を知る
  • 正規表現の検索文字に記号を使ってみる

目次

基本編

PHPにおいて正規表現による文字列の検索を行いたい場合は、主にpreg_match関数を使用して行います。
こちらの関数は文字列に対して検索を行い、特定の文字(単語)が含まれていたらtrueを、含まれていなかったらfalseを返します。

まずはシンプルに、テキストの中に特定の単語が含まれているかを確認してみましょう。

コード例

$res = null;
$str = 'my dog is very pretty. dog is really cute.';

if( preg_match( '/dog/', $str) )
	$res = true;
} else {
	$res = false;
}

var_dump($res);

実行結果

boolean true

解説

1行目、2行目は変数の初期化を行っています。
2行目で検索対象となる文字列を用意しておきます。

if文において、preg_match関数を使って正規表現による検索を行っています。
今回の例では、文字列の中に「dog」という文字列が含まれているかを確認。
見つかった場合はif文の中の処理を、見つからなかった場合はelse文の処理を実行。

正規表現においては小文字や大文字の違いも厳密に分けて行われるため、検索したい単語を「Dog」や「DOG」に変更すると結果はfalseが返ってきます。

最後にvar_dump関数で処理結果をダンプ出力して完了です。

先頭一致検索

基本編の例では文字列のどこに検索文字がある場合でもヒットしますが、もし文字列の先頭に特定の文字(単語)が存在するかを確認する「先頭一致」の検索にしたい場合は、次のようなコードになります。

コード例

$res = null;
$str = 'my dog is very pretty. dog is really cute.';

if( preg_match( '/^dog/', $str) ) {
	$res = true;
} else {
	$res = false;
}

var_dump($res);

使用している文字列の先頭は「my」のため、一致せずにfalseが返ってきます。

実行結果

boolean false

解説

preg_match関数で指定している「/^dog/」以外は、全て基本編と同じコードです。
ちょっと分かりづらいかもしれませんが、先頭一致検索を行うために、「dog」の前に記号「^」をつけています。
これをメタ文字と言い、検索方法の設定を行うために使われます。

今回の例では、文字列「my dog is very pretty. dog is really cute.」の先頭に「dog」があるかを確認しています。
文字列の先頭は「my」のため、「dog」と一致せずにfalseが返ってきます。

末尾一致検索

先頭一致のみでなく、文字列の末尾に特定の文字(単語)が存在するかを確認する「末尾一致」の検索も可能です。
その場合は、検索したい文字の後ろに「$」をつけます。

コード例

$res = null;
$str = 'my dog is very pretty. dog is really cute.';

if( preg_match( '/dog$/', $str) ) {
	$res = true;
} else {
	$res = false;
}

var_dump($res);

実行結果

boolean false

解説

メタ文字「$」が検索パラメータとして指定されているので、文字列「my dog is very pretty. dog is really cute.」の末尾に「dog」があるかを確認しています。
文字列の末尾は「cute.」のため、「dog」と一致せずにfalseが返ってきます。

完全一致

先頭一致の「^」と、末尾一致の「$」を組み合わせることで、完全一致の検索を指定することも可能です。
今回は検索対象となる文字列をあえて「dog」に変更した上で実行してみます。

コード例

$res = null;
$str = 'dog';

if( preg_match( '/^dog$/', $str) ) {
	$res = true;
} else {
	$res = false;
}

var_dump($res);

実行結果

boolean true

解説

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

「数字0字以上」を検索条件に追加

完全一致の設定に加えて、「0〜9の数字が0字以上続く」という設定を加えます。

コード例

$res = null;
$str = 'dog1235019512';

if( preg_match( '/^dog[0-9]*$/', $str) ) {
	$res = true;
} else {
	$res = false;
}

var_dump($res);

実行結果

boolean true

解説

完全一致の検索パラメータ「^」「$」に加えて、検索文字の後ろに「[0-9]*」というパラメータを追記しています。

括弧は特定の文字が含まれているかを1文字単位で指定したい場合に使います。
例えば、検索対象に「a」、「b」、「c」の3文字いずれかが含まれているかを確認したい場合は「[abc]」と指定します。
上記のコードでは数字の0〜9を指定したいので、「[0123456789]」を指定することになります。

連続した文字を指定する場合は「(半角ハイフン)」で省略することが可能です。
上記の「0123456789」であれば、「0-9」と記述することが可能です。
英字についても同様に、「abcdef」とアルファベット順になっている場合は「a-f」と省略した記述が可能です。

最後に後ろのメタ文字「*(半角アスタリスク)」ですが、これは「0字以上続く」という指定になります。
そのため、0字(続かない)でも、10字でも、さらに10,000字でも検索にヒットします。

以上のことから、検索対象となる文字列が「dog」と数字が1文字も無い場合でも、「dog1235019512」と続いた場合のいずれも、検索はヒットしてtrueが返ってきます。

「数字1字以上」を検索条件に追加

先ほどの例では「0字以上」でしたが、次は「1字以上」という設定にします。
1字以上ということは、最低でも1字は必要という検索条件になります。

コード例

$res = null;
$str = 'dog1235019512';

if( preg_match( '/^dog[0-9]+$/', $str) ) {
	$res = true;
} else {
	$res = false;
}

var_dump($res);

実行結果

boolean true

解説

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

最低でも1字は続く場合は「+」、1文字も無くてもOKとしたい場合は「*」と使い分けることができます。

応用編 「半角英数字を0字〜4字続く」を検索条件として指定

これまでの指定条件を踏まえつつ、少し複雑な検索条件を指定していきます。

コード例

$res = null;
$str = 'dog123b';

if( preg_match( '/^dog[0-9a-zA-Z]{0,4}$/', $str) ) {
	$res = true;
} else {
	$res = false;
}

var_dump($res);

実行結果

boolean true

解説

preg_match関数の中にある「//」内の条件式の内訳は下図のようになります。

正規表現の内訳を解説

括弧内「[]」で、半角英数(大文字、小文字どちらも)を指定し、続く「{}」の中で、「0字以上4文字以内」という指定を行なっています。ここが{2,4}だったら「2字以上、4字以内」となり、{5,7}だったら「5字以上、7字以内」のように指定することが可能です。

上記のコードでは、検索対象の文字が「dog」でもtrue、「dog61Bg」だったとしても「dog」以降に続く文字は半角英数の4字なのでtrueになります。
一方で、「dog61Bgb」だとすると「dog」の後ろに5字続いているのでfalseになります。

検索文字に記号を使う

検索に使う文字の中に記号を使いたい場合、文字と同じように記述すると「文字」として認識されません。そこで、「\(バックスラッシュ)」を使ってエスケープすることで「文字」として使えるようになります。

コード例

$res = null;
$str = 'dog*6Bb';

if( preg_match( '/dog\*/', $str) ) {
	$res = true;
} else {
	$res = false;
}

var_dump($res);

実行結果

boolean true

解説

上のコードでは、本来記号である「*(半角アスタリスク)」を文字として扱えるようにエスケープしています。

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

検索したい単語を複数指定することもできます。

コード例

$res = null;
$str = 'mouse and cat';

if( preg_match( '/dog|cat/', $str) ) {
	$res = true;
} else {
	$res = false;
}

var_dump($res);

実行結果

boolean true

解説

上のコードでは、検索対象の文字列に「dog」か「cat」が含まれているかを探しています。「|(パイプライン)」で区切ることで、3つ4つと任意の数だけ単語を指定することが可能です。

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

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

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