「文字列に特定の単語が含まれているか」を判定する処理は頻出です。PHPには複数の方法があり、PHP 8以降なら str_contains() が最も簡潔です。古い書き方の strpos() には「=== false で判定する」という落とし穴もあります。この記事では用途別に使い分けを解説します。
この記事の結論:含まれるかを確認するだけならPHP 8の
str_contains($haystack, $needle)が最も簡潔です。前方一致は str_starts_with()、後方一致は str_ends_with()。位置が必要なら strpos()(戻り値は === false で判定)、パターンなら preg_match() を使います。str_contains()で含まれるか確認する(PHP 8.0+・推奨)
str_contains() は「含まれているか」を真偽値で直接返します。=== false のような判定が不要で、最も読みやすい方法です。
str_contains(最も簡潔)
<?php
$haystack = "こんにちは、世界!";
if (str_contains($haystack, "世界")) {
echo "「世界」が含まれています";
} else {
echo "含まれていません";
}
前方一致・後方一致(PHP 8.0+)
「〜で始まるか」「〜で終わるか」は str_starts_with() /str_ends_with() で判定できます。URLや拡張子のチェックに便利です。
str_starts_with / str_ends_with
<?php $url = "https://example.com"; var_dump(str_starts_with($url, "https://")); // true $file = "report.pdf"; var_dump(str_ends_with($file, ".pdf")); // true
strpos()で位置を調べる(=== false の罠に注意)
「どの位置にあるか」も知りたいなら strpos() を使います。見つかれば位置(整数)、見つからなければ false を返します。PHP 7など str_contains が使えない環境でも、この方法で「含まれるか」を判定できます。
strpos(!== false で判定)
<?php
$haystack = "こんにちは、世界!";
if (strpos($haystack, "世界") !== false) {
echo "含まれています";
}
必ず
!== false(厳密比較)で判定してください。先頭で見つかると strpos() は 0 を返しますが、if (strpos(...)) だと 0 が偽と扱われ、「含まれているのに含まれていない」と誤判定します。strstr()と正規表現(preg_match)
strstr() は一致した部分から末尾までの文字列を返します(無ければ false)。複雑なパターン(数字のみ、特定の形式など)を判定したいなら preg_match() を使います。
strstr / preg_match
<?php
$haystack = "user@example.com";
// strstr: 一致部分以降を返す
echo strstr($haystack, "@"); // @example.com
echo strstr($haystack, "@", true); // user(第3引数trueで一致前を返す)
// preg_match: パターンで判定(メール形式かなど)
if (preg_match('/^[^@\s]+@[^@\s]+\.[^@\s]+$/', $haystack)) {
echo "メール形式です";
}
正規表現での置換はstr_replaceとpreg_replaceでの文字列置換、分割はpreg_splitで文字列を分割して配列にするで解説しています。
方法の使い分け
| やりたいこと | 方法 |
|---|---|
| 含まれるか(PHP 8+) | str_contains() |
| 〜で始まる/終わる(PHP 8+) | str_starts_with() / str_ends_with() |
| 含まれるか+位置(PHP 7も可) | strpos()(!== false) |
| 複雑なパターンで判定 | preg_match() |
よくある質問(FAQ)
Q文字列に含まれるか確認する一番簡単な方法は?
APHP 8以降なら
str_contains($haystack, $needle) です。真偽値を直接返すので最も読みやすく、=== false の判定も不要です。Qstrposで含まれるか判定するときの注意は?
A必ず
!== false で判定してください。先頭で見つかると 0 を返し、if (strpos(...)) だと偽と扱われて誤判定します。Qstr_containsが使えない環境(PHP 7)では?
A
strpos($haystack, $needle) !== false で代用します。前方一致は strpos(...) === 0、後方一致は substr と組み合わせて判定できます。Q大文字小文字を区別せずに探したいです。
A
strpos の代わりに stripos() を使うと大文字小文字を区別しません。str_contains で区別なく探すなら、両方を mb_strtolower() で小文字化してから比較する方法もあります。まとめ
PHPで文字列の含有・パターン判定のポイントを整理します。
- 含まれるか確認はPHP 8の
str_contains()が最も簡潔 - 前方/後方一致は
str_starts_with()/str_ends_with() - 位置が必要・PHP 7なら
strpos()(!== falseで判定) - 複雑なパターンは
preg_match() - 大文字小文字を無視するなら
stripos()
関連として、str_replaceとpreg_replaceでの置換・preg_splitで文字列を分割する方法・substrとmb_substrの使い方もあわせて読むと、PHPの文字列処理に強くなれます。
