- 更新日: 2018年03月26日
- 公開日: 2018年03月19日
【PHP初心者向け】特定の文字列を含むかをチェックする方法
PHPをコーディングしていると「文字列の中に特定のワードが含まれているか調べたい」という場面に遭遇することがあります。
PHPには文字列を検索するのに便利な関数が複数存在します。この記事では、その関数を使用して文字列に対して特定のワードを検索する方法をご紹介します。
【PHP初心者向け】特定の文字列を含むかをチェックする方法
文字列を検索して何がしたいかを決めよう
この記事をご覧になってる皆さんは、きっと文字列を検索してやりたいことがあるはずです。PHPでの文字列の検索に適した関数は複数存在しますが、それぞれに特徴とメリットがあり、目的によって使い分けた方がソースコードの可読性が高くなったり、PCのリソースが効率的に使用できます。皆さんの使いたい目的は次のうちどれでしょうか。
文字列を検索する目的 | 条件に適している関数 |
---|---|
条件式(if文等)の判定に使用したい | strpos |
検索をすると同時に、文字列を分割したい | strstr |
検索したいワードが複数存在する | preg_match |
PHPの文字列の検索は大きく分けて3種類
PHPの文字列の検索は大きく分けて3種類あります。1つめは「strpos関数」です。これは3つのうち最も高速でメモリ消費も少ないです。
2つめは「strstr関数」です。こちらは、検索したいワードがあった場合に、そのワードより後ろの文字列を返します。
3つめは「preg_match関数」です。これは正規表現を使って検索処理をおこなます。正規表現を使用するので複雑な検索条件で検索することができます。
strpos関数
strpos関数は、文字列内の検索したいワードが最初に現れる場所を見つけることができる関数です。
書式
strpos(第一引数,第二引数,第三引数)
引数 | 属性 | パラメータ |
---|---|---|
第一引数 | string | 検索を行う文字列 |
第二引数 | mixed | 検索したいワード |
第三引数(任意) | bool | 検索開始位置の指定 |
返り値
int型で返ってきます。「検索したいワード」が見つかった場合は、「検索を行う文字列の位置」を数字で返します。
文字列の開始位置は0であり、1ではないので特に「if文」で判定式を書くときは必ず「===演算子」(イコール3つ)を使用して厳密に評価しましょう。「検索したいワード」が見つからない場合は、「FALSE」を返します。
サンプルコード
<?php
$mystring = 'I am Taro. I am Japanese.';
$findme = 'I';
$position = strpos($mystring, $findme);
resultStrpos($mystring, $findme, $position);
// 第三引数を指定して、最初の「I」は無視する。
$position = strpos($mystring, $findme, 10);
resultStrpos($mystring, $findme, $position);
// 検索したいワードが見つからない場合、「FALSE」が返ってくる。
$findme = 'You';
$position = strpos($mystring, $findme);
resultStrpos($mystring, $findme, $position);
function resultStrpos($mystring, $findme, $position)
{
if ($position === false) {
echo "文字列 '$findme' は、文字列 '$mystring' の中で見つかりませんでした</br>";
} else {
echo "文字列 '$findme' が文字列 '$mystring' の中で見つかりました</br>";
echo " 見つかった位置は $position です</br>";
}
}
実行結果
ここでは、strpos関数の結果を日本語で表示してくれるresultStrpos関数を新たに定義しています。strpos関数の第三引数を指定してすると、「検索を行う文字列」の第三引数の位置から検索を始めます。
strstr関数
strstr関数は、文字列が最初に現れる位置を見つけて、最初に現れる場所を含めてそこから文字列の終わりまでを返す関数です。また今回は解説しませんが、大文字小文字を区別せずに検索するstristr関数も存在します。
書式
strstr(第一引数,第二引数,第三引数)
引数 | 属性 | パラメータ |
---|---|---|
第一引数 | string | 検索を行う文字列 |
第二引数 | mixed | 検索したいワード |
第三引数(任意) | bool | 返り値を検索したいワードの前と後ろのどちらを選択する(デフォルトは「後ろ」) |
第三引数に「TRUE」を指定することによって、返り値に検索したいワードより前の文字列を指定できます。これは言葉で説明するよりもサンプルコードを見た方が理解が早いと思うので、後ほど見てみましょう。
返り値
string型で返ってきます。「検索したいワード」が見つかった場合は、デフォルトは、「検索したいワード」を含めて現れた位置より後ろを「検索を行う文字列」の文字列を返します。「検索したいワード」が見つからない場合は、「FALSE」を返します。
サンプルコード
<?php
$email = 'name@example.com';
$domain = strstr($email, '@');
echo $domain . "</br>"; // @example.com と表示します
// 第三引数を指定して、検索したいワードより前の部分を返す
$user = strstr($email, '@', true);
echo $user . "</br>"; // name と表示します
実行結果
先ほどのstrpos関数は、「検索したいワード」が現れた位置を返していましたが、strstr関数は「検索したいワード」が現れた位置より後ろの文字列を返しています。第三引数を指定して「検索したいワード」より前の部分を返していることもわかります。
preg_match関数
preg_match関数は、正規表現による検索処理を行います。正規表現がわからない方は、「正規表現構文」も合わせてご覧ください。
書式
preg_match(第一引数,第二引数,第三引数,第四引数,第五引数)
引数 | 属性 | パラメータ |
---|---|---|
第一引数 | string | 検索するパターンを表す文字列(正規表現) |
第二引数 | string | 検索を行う文字列 |
第三引数(任意) | array | この引数を与えた場合、検索結果が代入される。$array[0]にパターン全体にマッチした文字列が代入され、$array[1]には1番目のキャプチャ用サブパターンにマッチした 文字列、$array[2]には2番目のキャプチャ用サブパターンにマッチした 文字列と続く。 |
第四引数(任意) | int | 「PREG_OFFSET_CAPTURE」と指定した場合に限り、第三引数の中に、「検索を行う文字列」のどの位置にあったのも一緒に返すようにする。 |
第五引数(任意) | int | 「検索を行う文字列」のどの位置から検索を行うか、バイト単位で指定する。(文字数ではない) |
かなり詳細な検索条件をパラメータで指定できますが、慣れないと複雑に感じられます。第四引数と第五引数は今回は説明しませんが、慣れてくるまでは省略しても問題ありません。
返り値
int型で返ってきます。「検索したいワード」が見つかった場合は、「1」を返します。「検索したいワード」が見つからない場合は、「0」を返します。エラーが発生した場合は、「FALSE」を返します。
サンプルコード
<?php
$pattern = '/(php)[\s\w]*(language)/i';
$mystring = "PHP is the web scripting language of choice.";
// パターンのデリミタの後の "i" は、大小文字を区別しない検索を示す
if (preg_match($pattern, $mystring, $matches)) {
echo "<pre>";
print_r($matches);
echo "</pre>";
} else {
echo "'$mystring'の中には見つかりませんでした";
}
実行結果
「検索を行う文字列」の中から、「PHP」と「language」があるか検索しています。第三引数を指定して、$matchsにヒットしたパターンを格納します。$matchs[0]には「検索を行う文字列」の「language」までの文字列が入ります。$matchs[1]には1番目のキャプチャ用サブパターンの「PHP」が入ります。$matchs[2]には同じように「language」が入ります。
\Webサイト担当者としてのスキルが身に付く/
まとめ
PHPでの文字列の検索についてサンプルコードを織り交ぜて、解説していきました。 3つの関数それぞれが、どのような場面で一番力を発揮するのかわかってきたと思います。最初はstrpos関数やstrstr関数を使っていき、正規表現に慣れてきたらぜひpreg_match関数を使ってください。正規表現の強力なパワーを実感できると思います。
参考文献
- この記事を書いた人
- 山川竜太郎