PHPで、文字列の中に特定の文字列が含まれるかを検索する4つの関数str_contains
, strpos
, strstr
, preg_match
について解説します。
PHPで文字列を検索する方法の比較表
PHPで文字列を検索する4つの関数の違いを一覧表にしました。
関数 | マッチした場合の戻り値 | マッチしなかった場合の戻り値 | 説明 |
---|---|---|---|
str_contains() | true | false | 文字列が含まれるかを調べる最もシンプルな方法。PHP 8.0以降で利用可能。 |
strpos() | 文字列が最初に現れる位置を表す数値 | false | PHP 8.0未満で、文字列が含まれるかを調べる最適な方法。 |
strstr() | 文字列が最初に現れる位置から文字列の終わりまでの部分文字列 | false | 部分文字列を取得したい時に使う。 |
preg_match() | 1 | 0 | 正規表現を使った検索をしたい時に使う。 |
無料で利用できるプログラミング学習サービスをお探しならば Code Lesson はいかがでしょうか。プロのエンジニアが監修した学習ロードマップで効率的に学習、AIに質問、最後にクイズで理解度をチェックできます。
str_contains()
str_contains()
は、指定した部分文字列が別の文字列に含まれるかを調べる関数です。
str_contains()関数の書式
str_contains($haystack, $needle)
- 第一引数
$haystack
は、検索対象の文字列です。 - 第二引数
$needle
は、検索する文字列です。 - 戻り値は、
$haystack
に$needle
が含まれていればtrue
、含まれていなければfalse
です。 - 大文字小文字は区別されます。
- 日本語などのマルチバイト文字も扱えます。
- PHP 8.0以降で使うことができます。
PHPのマニュアルで関数の説明をするときによく出てくるhaystackとneedleという単語。意味わかんねーなとずっと思ってたので調べてみました。
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
を返すことがあるためです。緩やかな比較では0
はfalse
と同じとみなされるので意図した動作をしません。
次は日本語を扱う例です。
$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」が含まれています
*/
戻り値は、1
、0
、false
のいずれかです。0
とfalse
を区別して処理するために、厳密な比較(===
、!==
)を使いましょう。
さいごに
というわけで、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()
はさすがに遅いです。なので、速度というよりは用途によって使い分けましょう。
でわでわ
コメント