str_contains($haystack, $needle)は、$needleが$haystackのどこかに現れればtrueを、そうでなければfalseを返します。PHP 8.0で追加され、大文字小文字を区別します。
strpos()と違って本物の真偽値を返すので、「位置0で見つかるとfalseに見える」という罠がありません。
構文
str_contains(string $haystack, string $needle): bool
str_starts_with(string $haystack, string $needle): bool
str_ends_with(string $haystack, string $needle): bool
3つともPHP 8.0で追加され、バイト単位で動くので、mb_版がなくても日本語などのUTF-8テキストを正しく扱えます。
str_starts_withとstr_ends_withで先頭や末尾を確認する
大文字小文字を区別しない判定
str_icontains()はありません。先に両方の文字列を小文字にします。mb_strtolower()は、strtolower()がそのままにするÉやキリル文字のようなASCII以外の文字も小文字にします。
空の探す文字列はtrueを返す
空の探す文字列は、空文字列も含め、どんな文字列の中にも見つかります。ユーザーが空のままにした検索欄から探す文字列が来る場合に問題になります。
複数の単語のいずれか、またはすべてを含むか確認する
str_contains()が受け取る探す文字列は1つです。探す文字列の配列をループし、「いずれか」なら1つ一致した時点で、「すべて」なら1つ失敗した時点で返します。
文字列の部分文字列ではなく、値が配列の要素の1つかどうかを確認するには、in_array()を使います。
PHP 8より前:strpos !== false
PHP 7で動く必要があるコードは、strpos()を厳密な比較と組み合わせて使います。空の探す文字列を除けば、str_contains()と同じ答えになります。PHP 7のstrpos()は、空の探す文字列に対してWarning: strpos(): Empty needleを表示してfalseを返していました。
テキストはあるのに、phpは位置0にあるので、最後の行はbool(false)を表示します。このような判定をstr_contains()に置き換えるのは、もっとも簡単なPHP 8へのアップグレードの1つです。
よくある質問
PHPで文字列に単語が含まれているか確認するには?
PHP 8ならtrueかfalseを返すstr_contains($haystack, $needle)を使います:str_contains('Hello world', 'world')はtrueです。PHP 7ではstrpos($haystack, $needle) !== falseを使います。
str_containsは大文字小文字を区別しますか?
区別します。区別しない判定には、両辺を小文字にする(str_contains(mb_strtolower($haystack), mb_strtolower($needle)))か、stripos($haystack, $needle) !== falseを使います。
str_containsが空文字列に対してtrueを返すのはなぜですか?
どんな文字列も空文字列を含んでいるので、str_contains('abc', '')はtrueを返します。探す文字列がユーザーの入力から来るなら、先に空でないことを確認してください。
PHPで文字列が何かで始まるか、終わるかを確認するには?
どちらもPHP 8.0で追加されたstr_starts_with($s, 'http')とstr_ends_with($s, '.pdf')を使います。str_contains()と同じく大文字小文字を区別し、boolを返します。