【PHP】文字列に特定の文字が含まれるか確認する方法|str_containsとstrpos

「文字列に特定の単語が含まれているか」を判定する処理は頻出です。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)では?
Astrpos($haystack, $needle) !== false で代用します。前方一致は strpos(...) === 0、後方一致は substr と組み合わせて判定できます。
Q大文字小文字を区別せずに探したいです。
Astrpos の代わりに 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の文字列処理に強くなれます。