PHPで文字列検索をする関数とは?記述方法と注意点を解説

プログラミング
PHPではいくつかの方法で文字列検索をすることができます。似た用途の関数が複数ありますが、それぞれに特徴が異なります。特に返り値として何を返すのかということに着目する必要があるでしょう。具体的にはstrpos()関数、preg_match()関数、preg_match_all()関数などの解説、さらに配列に対する文字列検索についても使えるようにしておきましょう。
PHPで文字列検索をする関数とは?記述方法と注意点を解説

PHPで文字列の検索をするための関数は1つではありません。いくつか用意されています。そしてそれぞれに特徴が異なるため、上手く使い分けていくことが重要になってきます。
これらの関数で特に注意すべきポイントは何が返り値になるのかということであり、以下では文字列検索に使われる各関数の具体的な記述方法や返り値について紹介していきます。

PHPで文字列の検索を行う必要性

プログラミングの勉強では、実際に何かを制作してみることが上達への早道でもあるとも言われています。PHPはWebアプリの構築を得意としていますので、インターネット上で提供されるサービスを考えてみましょう。

世の中には会員登録をして、その後はログインを行うことでサービスを提供するというケースも多くあります。会員登録のときに氏名住所、電話番号、メールアドレス、パスワードなどを入力したこともあるかと思います。そしてこれらを入力し送信ボタンなどを押すと、「会員登録完了」などと表示されることもあれば、ページ遷移せず「正しい形式で入力してください」などと再入力を促されることもあります。例えばメールアドレスは「@」が間に入力されるはずであるところ、入力ミスでこれが抜けてしまうと正しいメールアドレスを登録することができません。そのため文字列中に「@」が含まれているかどうかチェックする機能があると便利です。ほかにも、郵便番号の入力でハイフンを必要とする場合にはそのチェックなどができるとユーザーによる一定範囲のミスを防ぐことができます。

こうした機能は、特定文字列の検索ができる関数を応用させると実現できます。文字列の検索をするための関数はいくつかありますので、以下でそれぞれ解説していきます。

文字列を検索する関数とその使い方

文字列を検索する関数として、「strpos()」「preg_match()」「preg_match_all()」などがよく使用されます。これらの関数を使えばよく似た効果を得られますが、それぞれに特徴があるため、その特徴をしっかりと理解して使用していかなければ思わぬ挙動を起こすプログラムが出来上がってしまいます。
具体的な記述例とともに、各関数を比較しながら使い方を覚えていきましょう。

strpos()は返り値に注意

「特定の文字列が含まれているのか?」という問題に対してはまずstrops()を使えないか検討してみましょう。
そしてこの場合に最も注意すべきポイントは返り値です。関数の使い方自体はそれほど難しいものではありませんが、返り値の違いは押さえていかなければ混乱を招きます。
strpos()では、第1引数の文字列から第2引数の文字列を検索します。返り値としては、特定の文字列が「最初に見つかった位置」を整数で返します。さらに開始位置は0であることにも注意してください。

記述例を見てみましょう。

$string = 'ABCDE';
$find   = 'A';
$pos = strpos($string, $find);

if ($pos !== false) {
    echo "'$find'は位置「'$pos'」にありました。";
} else {
    echo "'$find'はありませんでした。";
}

//出力結果
'A'は位置「'0'」にありました。

strops()の返り値を上のプログラム例のように使う場合、条件式において比較演算子を「!=」ではなく「!==」としている点に注視しましょう。この場合はAが文字列の最初にあり返り値が0となるため、「!=」としてしまうと「'A'はありませんでした。」と出力されてしまうのです。

preg_match()は「1」「0」「false」を返す

strops()と同じく特定の文字列が含まれているかどうかを判断できます。しかし正規表現を用いることや、返り値として検索に引っかかった回数を返すという点で違う性質を持っています。しかも、検索に引っかかった回数を返しすものの1回文字列が見つかればそこで検索を終えるため、結局のところpreg_match()が返すのは特定の文字列が含まれていた場合の「1」か、含まれていなかった場合の「0」ということになります。
さらに、エラーが発生した場合には「false」を返すことも特徴的です。

記述例を見てみましょう。

$string = 'ABCDE';
$find   = '/A/';

if (preg_match($find,$string)) {
    echo "文字列は見つかりました。";
} else {
    echo "文字列は見つかりませんでした。";
}

//出力結果
文字列は見つかりました。

pregmatch()では探す文字列を正規表現の形で表現しなければなりません。そのため文字列をデリミタで囲む必要があり、例のように「/(スラッシュ)」などを使います。
こうしてstrpos()と比べて見ると、単に特定の文字列が含まれていたかどうかを判定するのであればどちらの関数でも良いように思えます。しかしどちらでも良い場合にstrpos()が推奨されるのはパフォーマンスが高く、少しだけ高速に処理を行えるからです。

preg_match_all()は1回のマッチングで止まらない

preg_match_all()はpreg_match()のように1回のマッチングでは処理を止めません。
そのため以下のような結果を得ることができます。

$string = 'ABCDEA';
$find   = '/A/';
$pos = preg_match_all($find,$string);
 
if ($pos !== false){
    echo "文字列は'$pos'回見つかりました。";
} else {
    echo "文字列は見つかりませんでした。";
}

//出力結果
文字列は'2'回見つかりました。

配列で値を検索する方法

特定の文字列を検索したい場合、検索をかける対象が配列であることもあるでしょう。
その場合、strpos()やpreg_match()、preg_match_all()などは使用せず「array_search()」「in_array()」などを使って検索します。この場合もやはりそれぞれの関数は使い方や意味も似ているものの返り値の違いなど、性質に微妙な差異があることに注意しなければなりません。

array_search()は要素のキーを返す

array_search()は検索した値を持つ要素が存在した場合、その要素のキーを返します。
そこで以下のような使い方ができます。

$array = array(
    'No.0' => 'red',
    'No.1' => 'blue',
    'No.2' => 'green',
    'No.3' => 'white'
);
$key = array_search('green', $array);
echo "要素「green」に対応するキーは'$key'です。";

//出力結果
要素「green」に対応するキーは'No.2'です。

検索した値が見つからない場合にはfalseを返すということも覚えておくとよいでしょう。

in_array()は論理値を返す

in_array()も配列に対する文字列の検索ですが、array_search()と違うのは論理値を返すということです。そのため、検索が引っかからなかった場合にfalseを返す点は共通しています。

$array = array(
    'No.0' => 'red',
    'No.1' => 'blue',
    'No.2' => 'green',
    'No.3' => 'white'
);
$key = in_array('green', $array);
var_export($key);

//出力結果
true

まとめ

ある文字列を検索するにはstrpos()、preg_match()、もしくはpreg_match_all()などが利用でき、それぞれの返り値の違いには特に注意が必要ということを説明しました。
まとめると以下のようになります。

  • strops()は文字列が見つかった位置が分かる
  • preg_match()は見つかったかどうかの判定のみ可能
  • preg_match_all()は見つかった回数が分かる

また、配列に対して特定の文字列の検索をかけるにはarray_search()、in_array()などがよく使われます。

  • array_search()は検索した要素のキーが分かる
  • in_array()は要素が見つかったかどうかの判定のみ可能

それぞれこのような特徴を持っています。これらの関数を使うと様々な事例で応用することができるため、使いどころを見極めて使いこなせるようにするといいでしょう。


この記事のキーワードに関する勉強会・イベントを探す

TECH PLAYでは、ITエンジニア向けの勉強会・イベント情報を提供しています。
興味のある方はぜひご参加ください。


おすすめのコラム