strpos() は、文字列の中に別の文字列が含まれているか・どこにあるかを調べる PHP 組み込み関数です。
<?php
$pos = strpos('Hello, PHP!', 'PHP'); // 7
var_dump($pos !== false); // bool(true)
?>
最重要ポイント: strpos() が 0 を返す場合は「先頭で見つかった」を意味します。false(見つからない)と混同しないよう、必ず !== false の厳密比較を使ってください。
strpos() の基本構文
strpos(string $haystack, string $needle, int $offset = 0): int|false
- $haystack:検索対象の文字列
- $needle:探したい部分文字列
- $offset:検索開始位置(省略可、デフォルト 0)
- 戻り値:見つかった位置(0始まりの整数)、見つからなければ
false
0 と false を区別する(最重要)
strpos() の最大の落とし穴は、見つかった位置が 0(先頭)の場合に false と区別がつかなくなることです。
<?php
$str = 'PHP is great';
$pos = strpos($str, 'PHP'); // 先頭にあるので 0 が返る
// NG: 0 は false と等価なので誤動作する
if ($pos) {
echo '見つかった'; // ← 実行されない(バグ!)
}
// OK: !== を使って厳密比較する
if ($pos !== false) {
echo '見つかった: ' . $pos . ' 文字目'; // 正しく動作
}
?>
PHP は 0 == false を true と評価するため、if ($pos) では先頭にあるケースを「見つからなかった」と誤判定します。必ず === false または !== false で比較してください。
用途別の使用例
文字列を含むか判定する
<?php
$text = 'Hello, PHP World!';
if (strpos($text, 'PHP') !== false) {
echo '「PHP」が含まれています';
} else {
echo '「PHP」は含まれていません';
}
?>
見つかった位置を取得する
<?php
$text = 'Welcome to PHP!';
$pos = strpos($text, 'PHP');
if ($pos !== false) {
echo '「PHP」は ' . $pos . ' 文字目にあります'; // 11文字目
}
?>
先頭にあるか判定する
<?php
$str = 'PHP is awesome';
if (strpos($str, 'PHP') === 0) {
echo '文字列の先頭に「PHP」があります';
}
?>
大文字小文字を区別しない場合(stripos)
大文字・小文字を区別せずに検索したい場合は stripos() を使います。
<?php
$text = 'Hello World';
// strpos では見つからない(大文字小文字が異なる)
var_dump(strpos($text, 'hello')); // bool(false)
// stripos なら見つかる
var_dump(stripos($text, 'hello')); // int(0)
?>
str_contains() との違い(PHP 8.0+)
PHP 8.0 から str_contains() が追加されました。「含むかどうか」だけを調べる場合はこちらがより直感的で安全です。
<?php
$text = 'Hello, PHP!';
// PHP 7 以前の書き方(strpos)
if (strpos($text, 'PHP') !== false) {
echo '含む';
}
// PHP 8.0 以降の書き方(str_contains)
if (str_contains($text, 'PHP')) {
echo '含む';
}
?>
| 関数 | PHP バージョン | 戻り値 | 主な用途 |
|---|---|---|---|
strpos() |
全バージョン | int|false | 位置取得・含む判定どちらも |
str_contains() |
PHP 8.0+ | bool | 含むかどうかだけ調べる |
str_starts_with() |
PHP 8.0+ | bool | 先頭一致かどうか |
位置を知る必要がなく「含むかどうか」だけ判定する場合は、PHP 8.0 以上なら str_contains() のほうがシンプルで 0 / false 問題も起きません。
mb_strpos() が必要なケース
strpos() はバイト単位で位置を数えるため、日本語などのマルチバイト文字を扱うと正確な文字位置が取れないことがあります。その場合は mb_strpos() を使います。
<?php
$text = 'こんにちは PHP!';
// strpos: バイト単位(UTF-8 では日本語 1 文字 = 3 バイト)
$bytePos = strpos($text, 'PHP'); // 15(バイト位置)
// mb_strpos: 文字単位
$charPos = mb_strpos($text, 'PHP'); // 5(文字位置)
echo 'strpos: ' . $bytePos . PHP_EOL; // 15
echo 'mb_strpos: ' . $charPos . PHP_EOL; // 5
?>
| 関数 | 計測単位 | 日本語対応 |
|---|---|---|
strpos() |
バイト | △(位置がずれる) |
mb_strpos() |
文字 | ○(正確) |
日本語・中国語・韓国語など 2 バイト以上の文字を含む文字列を扱う場合は、常に mb_strpos() を選びましょう。
まとめ
strpos()は文字列内の検索位置を返す。見つからない場合はfalse- 戻り値が
0= 先頭で見つかった(falseではない) - 判定は必ず
!== falseの厳密比較を使う - 「含むかだけ調べる」なら PHP 8.0+ の
str_contains()がシンプル - 日本語などマルチバイト文字には
mb_strpos()を使う
FAQ
strpos とは?
strpos() は PHP の組み込み文字列関数で、指定した文字列($haystack)の中から別の文字列($needle)が最初に現れる位置を返します。見つかった場合は 0 以上の整数、見つからない場合は false を返します。PHP のすべてのバージョンで利用可能です。
strpos が 0 を返すのはどういう意味?
検索したい文字列が対象文字列の先頭(0 文字目)で見つかったことを意味します。false(見つからない)ではありません。if ($pos) のように評価すると 0 と false が区別できずバグになります。必ず if ($pos !== false) と書きましょう。
文字列を含むかだけ判定するには?
PHP 8.0 以上なら str_contains($text, 'keyword') が最もシンプルで安全です。PHP 7 系では strpos($text, 'keyword') !== false で代替できます。どちらも 0 / false の問題を意識せずに使えます(str_contains は bool を返すため)。

コメント