Parallels Desktop 20%OFFセール中Check!

【PHP入門】文字列を含むか検索する4つの方法を比較

PHPで文字列を検索する方法

PHPで、文字列の中に特定の文字列が含まれるかを検索する4つの関数str_contains, strpos, strstr, preg_matchについて解説します。

目次

PHPで文字列を検索する方法の比較表

PHPで文字列を検索する4つの関数の違いを一覧表にしました。

関数マッチした場合の戻り値マッチしなかった場合の戻り値説明
str_contains()truefalse文字列が含まれるかを調べる最もシンプルな方法。PHP 8.0以降で利用可能。
strpos()文字列が最初に現れる位置を表す数値falsePHP 8.0未満で、文字列が含まれるかを調べる最適な方法。
strstr()文字列が最初に現れる位置から文字列の終わりまでの部分文字列false部分文字列を取得したい時に使う。
preg_match()10正規表現を使った検索をしたい時に使う。

str_contains()

str_contains()は、指定した部分文字列が別の文字列に含まれるかを調べる関数です。

str_contains()関数の書式

str_contains($haystack, $needle)
  • 第一引数$haystackは、検索対象の文字列です。
  • 第二引数$needleは、検索する文字列です。
  • 戻り値は、$haystack$needleが含まれていればtrue、含まれていなければfalseです。
  • 大文字小文字は区別されます。
  • 日本語などのマルチバイト文字も扱えます。
  • PHP 8.0以降で使うことができます。
haystackとneedleってなんなん

PHPのマニュアルで関数の説明をするときによく出てくるhaystackneedleという単語。意味わかんねーなとずっと思ってたので調べてみました。

a needle in a haystack という英語の慣用句が由来だそうです。干し草の山(haystack)の中から1本の針(needle)を見つけ出すことで、見つけるのが極めて困難という意味だそうです。

str_contains()関数の使い方

$string = 'はろー、わーるど!';

if (str_contains($string, 'わーるど')) {
  echo '文字列内に「わーるど」が含まれています';
} else {
  echo '文字列内に「わーるど」は含まれていません';
}

/*実行結果
文字列内に「わーるど」が含まれています
*/

戻り値がtrueまたはfalseしかないので、とても簡単に条件分岐ができますね。次に解説するstrpos()戻り値の罠があるので、それと比較しても扱いやすい関数です。

ただし、使えるのはPHP 8.0以降なのでご注意を。

strpos()

strpos()は、指定した部分文字列が別の文字列内で最初に現れる位置を調べる関数です。

strpos()関数の書式

strpos($haystack, $needle)
  • 第一引数$haystackは、検索対象の文字列です。
  • 第二引数$needleは、検索する文字列です。
  • $needleが最初に現れた位置を数値で返します。$haystackの1文字目ならば0、2文字目ならば1を返します。見つからない場合はfalseを返します。
  • 大文字小文字は区別されます。区別しない関数stripos()もあります。
  • 日本語などのマルチバイト文字を扱うときはmb_strpos()を使いましょう。

strpos()関数の使い方

$string = 'Hello, World!';

$position = strpos($string, 'Hello');
if ($position !== false) {
  echo "文字列内に「Hello」が含まれています 位置: $position";
} else {
  echo '文字列内に「Hello」は含まれていません';
}

/*実行結果
文字列内に「Hello」が含まれています 位置: 0
*/

if文の条件式では必ず厳密な比較(!==, ===)を使います。緩やかな比較(!=,==)をしてはいけません。これは、この関数は文字列が含まれない場合にfalseを返しますが、含まれる場合に0を返すことがあるためです。緩やかな比較では0falseと同じとみなされるので意図した動作をしません。

次は日本語を扱う例です。

$string = 'はろー、わーるど!';

//strpos()を使った場合
$position = strpos($string, 'わーるど');
if ($position !== false) {
  echo "文字列内に「わーるど」が含まれています 位置: $position";
} else {
  echo "文字列内に「わーるど」は含まれていません";
}

/*実行結果
文字列内に「わーるど」が含まれています 位置: 12
*/

//mb_strpos()を使った場合
$string = 'はろー、わーるど!';

$position = mb_strpos($string, 'わーるど');
if ($position !== false) {
  echo "文字列内に「わーるど」が含まれています 位置: $position";
} else {
  echo '文字列内に「わーるど」は含まれていません';
}

/*実行結果
文字列内に「わーるど」が含まれています 位置: 4
*/

strpos()を使うと、正しい位置を取得できません。mb_strpos()を使うと正しい位置が取得できます。

strstr()

strstr()は、指定した部分文字列が別の文字列内で最初に現れる位置およびそれ以降の文字列を取得する関数です。

strstr()の書式

strstr($haystack, $needle)
  • 第一引数$haystackは、検索対象の文字列です。
  • 第二引数$needleは、検索する文字列です。
  • $haystackの中で$needle最初に現れる位置を含めてそこから文字列の終わりまでを返します。見つからない場合はfalseを返します。
  • 大文字小文字は区別されます。区別しない関数stristr()もあります。
  • 日本語などのマルチバイト文字を扱うときはmb_strstr()を使いましょう。

strstr()の使い方

$email = 'user@example.com';

$domain = strstr($email, '@');
if ($domain !== false) {
  echo "ドメインは $domain です";
} else {
  echo 'ドメインが見つかりませんでした';
}

/*実行結果
ドメインは @example.com です
*/

第三引数にtrueを指定すると、戻り値が検索文字列より前の部分になります。検索文字列は含みません。

$email = 'user@example.com';

$user = strstr($email, '@', true);
if ($user !== false) {
  echo "ユーザ名は $user です";
} else {
  echo 'ユーザ名が見つかりませんでした';
}

/*実行結果
ユーザ名は user です
*/

もし、文字列が含まれるかどうかだけを調べるならば、より高速でメモリ消費も少ないstrpos()を使いましょう。PHP 8.0以上ならばstr_contains()もアリです。

preg_match()

preg_match()は、正規表現によるマッチングを行う関数です。

preg_match()の書式

preg_match($pattern, $subject)
  • 第一引数$patternは、検索する文字列の正規表現です。
  • 第二引数$subjectは、検索対象の文字列です(これはhaystackって言わないんだね)。
  • 戻り値は、$pattern$subjectにマッチしたら1、マッチしなければ0です。失敗したらfalseを返します。

preg_match()の使い方

$string = 'Hello, World!';

$result = preg_match('/[Ww]orld/', $string);
if ($result === false) {
  echo "検索に失敗しました";
} elseif ($result === 0) {
  echo "文字列内に「World」または「world」は含まれていません";
} else {
  echo '文字列内に「World」または「world」が含まれています';
}

/*実行結果
文字列内に「World」または「world」が含まれています
*/

戻り値は、10falseのいずれかです。0falseを区別して処理するために、厳密な比較(===!==)を使いましょう。

さいごに

というわけで、PHPで文字列を検索する方法について解説しました。おさらいしましょう。

関数説明
str_contains()PHP 8.0以降で文字列が含まれるかを調べるならこれ。
strpos()PHP 8.0未満で文字列が含まれるかを調べるならこれ。文字列が出現する位置を調べるのもこれ。
strstr()文字列の出現位置以降(or以前)の部分文字列を取得したいならこれ。
preg_match()正規表現を使った検索をしたいならこれ。

strstr()よりもstrpos()のほうが高速だと言われますが、PHP 8.2下で行った私の実験ではstr_contains(), strpos(), strstr()速度はほぼ同じでした。差があったとしても誤差の範囲です。preg_match()はさすがに遅いです。なので、速度というよりは用途によって使い分けましょう。

でわでわ

プログラミング学習、お疲れさまです

プログラミングの独学に行き詰まっていませんか?誰かに相談したい、もっと効率よく学びたいなら、プログラミングスクールを検討してみてください。

PHPで文字列を検索する方法

この記事が気に入ったら
いいね または フォローしてね!

シェアしてね

コメント

コメントする

目次