はじめに
PHPで開発をしていると、
「この文字列の中に、特定の文字が含まれているか調べたい」
という場面がよくあります。
たとえば、URLの中に特定の文字が含まれているか、投稿タイトルに特定のキーワードが含まれているか、入力された文字列に指定した語句があるかを判定したい場合です。
このようなときに使えるのが、PHPの str_contains() です。
str_contains()とは
str_contains() は、文字列の中に指定した文字列が含まれているかを調べるPHP関数です。
PHP公式マニュアルでは、str_contains() は「指定した文字列が対象文字列に含まれているかを判定する関数」として説明されています。PHP 8以降で利用できます。
基本的な書き方は次の通りです。
str_contains(調べる文字列, 探したい文字列);
戻り値は true または false です。
含まれていれば true、含まれていなければ false が返ります。
基本的な使い方
たとえば、次のような文字列があるとします。
$text = 'WordPressのカスタマイズ方法';
この中に WordPress という文字が含まれているか調べる場合は、次のように書きます。
$text = 'WordPressのカスタマイズ方法';
if (str_contains($text, 'WordPress')) {
echo '含まれています';
} else {
echo '含まれていません';
}
この場合、$text の中に WordPress が含まれているため、結果は次のようになります。
含まれています
引数の意味
str_contains() には、2つの値を指定します。
str_contains($haystack, $needle);
$haystack は、検索対象となる文字列です。
$needle は、探したい文字列です。
つまり、次のコードは、
str_contains('WordPressのカスタマイズ方法', 'WordPress');
「WordPressのカスタマイズ方法」という文字列の中に、「WordPress」が含まれているかを確認しています。
大文字と小文字は区別される
str_contains() は、大文字と小文字を区別します。PHP公式マニュアルにも、大小文字を区別して判定する関数として記載されています。
たとえば、次のコードを見てください。
$text = 'WordPress';
var_dump(str_contains($text, 'WordPress'));
var_dump(str_contains($text, 'wordpress'));
結果は次のようになります。
bool(true)
bool(false)
WordPress と wordpress は、見た目は似ていますが、先頭の W が大文字か小文字かで別の文字列として扱われます。
大文字と小文字を区別せずに調べたい場合は、検索前に文字列を小文字にそろえるなどの工夫が必要です。
$text = 'WordPress';
if (str_contains(strtolower($text), 'wordpress')) {
echo '含まれています';
}
WordPressカスタマイズでの使用例
WordPressのカスタマイズでは、URLやクラス名、投稿タイトル、本文などに特定の文字が含まれているかを判定したい場面があります。
たとえば、現在のURLに特定の文字が含まれている場合だけ処理を変えたい場合は、次のように使えます。
$current_url = 'https://example.com/blog/wordpress-customize/';
if (str_contains($current_url, 'wordpress')) {
echo 'WordPress関連ページです';
}
また、投稿タイトルに特定のキーワードが含まれているかを調べることもできます。
$title = 'WordPressで外部リンクを新しいタブで開く方法';
if (str_contains($title, '外部リンク')) {
echo '外部リンクに関する記事です';
}
このように、条件分岐と組み合わせることで、特定の文字が含まれている場合だけ処理を実行できます。
PHP 7系では使えない点に注意
str_contains() はPHP 8から使える関数です。
そのため、PHP 7系の環境で使うと、次のようなエラーになる可能性があります。
Call to undefined function str_contains()
PHP 7系など古い環境で同じような判定をしたい場合は、strpos() を使います。
$text = 'WordPressのカスタマイズ方法';
if (strpos($text, 'WordPress') !== false) {
echo '含まれています';
}
ここで重要なのは、必ず !== false と書くことです。
strpos() は、見つかった位置を数値で返します。文字列の先頭で見つかった場合は 0 を返します。
しかし、PHPでは 0 が false のように判定されることがあるため、単純に次のように書くと誤判定の原因になります。
if (strpos($text, 'WordPress')) {
echo '含まれています';
}
この書き方では、先頭に文字がある場合に正しく判定できないことがあります。
そのため、古いPHPでは次の書き方が安全です。
if (strpos($text, 'WordPress') !== false) {
echo '含まれています';
}
str_contains()を使うメリット
str_contains() のメリットは、コードの意味が非常にわかりやすいことです。
str_contains($text, 'WordPress')
このコードは、英語の意味そのままで「文字列にWordPressが含まれているか」と読めます。
一方で、strpos() は本来「文字列の位置を調べる関数」です。
strpos($text, 'WordPress') !== false
この書き方でも判定はできますが、初心者にとっては少し読みづらくなります。
PHP 8以上の環境であれば、文字列が含まれているかを調べるだけなら、str_contains() を使った方がシンプルです。
空文字を指定した場合
少し特殊な挙動として、探したい文字列に空文字を指定すると、str_contains() は true を返します。PHP公式マニュアルにも、空文字の存在確認は常に true になる例が掲載されています。
var_dump(str_contains('abc', ''));
結果は次のようになります。
bool(true)
通常の実装では、検索する文字列が空にならないように事前チェックしておくと安全です。
$text = 'WordPressのカスタマイズ方法';
$keyword = '';
if ($keyword !== '' && str_contains($text, $keyword)) {
echo '含まれています';
}
まとめ
str_contains() は、PHPで文字列の中に特定の文字が含まれているかを判定するための関数です。
PHP 8以上で使うことができ、戻り値は true または false です。
基本形は次の通りです。
str_contains(調べる文字列, 探したい文字列);
PHP 8以上なら、文字列の含有判定には str_contains() を使うと、コードが読みやすくなります。
一方、PHP 7系など古い環境では str_contains() が使えないため、strpos() と !== false を組み合わせて判定します。
WordPressカスタマイズやPHP開発で、URL、タイトル、本文、クラス名などに特定の文字が含まれているか調べたいときに便利な関数です。
