strpos() 回傳子字串在字串中首次出現的位置(0 起算)。但其回傳值可能是 0(找到在開頭)或 false(未找到),直接用 == 比較會導致邏輯錯誤,必須使用 === 嚴格比較。
<?php
echo strpos("Hello world!", "wo") . "\n"; // 6
echo strpos("Hello world!", "xyz") . "\n"; // 空字串(實際為 false)
?>
<?php
$haystack = "needle23423432";
$pos = strpos($haystack, "needle"); // 0
// 錯誤寫法:== 比較
if ($pos == false) {
echo "未找到 (==)\n"; // 會執行!因為 0 == false 為 true
} else {
echo "找到 (==)\n";
}
// 正確寫法:=== 嚴格比較
if ($pos === false) {
echo "未找到 (===)\n";
} else {
echo "找到 (===),位置: $pos\n"; // 正確輸出
}
?>
<?php
function contains(string $haystack, string $needle): bool {
return strpos($haystack, $needle) !== false;
}
// 或使用 PHP 8 新函數
// str_contains($haystack, $needle) // 直接回傳 bool
?>
<?php
echo stripos("Hello World", "world") . "\n"; // 6
echo strpos("Hello World", "world") . "\n"; // false (區分大小寫)
?>
<?php
function strposAll(string $haystack, string $needle): array {
$positions = [];
$offset = 0;
while (($pos = strpos($haystack, $needle, $offset)) !== false) {
$positions[] = $pos;
$offset = $pos + 1;
}
return $positions;
}
print_r(strposAll("ababa", "aba")); // [0, 2]
?>
str_contains(),舊版用 strpos() !== false。preg_match() 或建立索引(如倒排索引)。strpos() 檢查同一字串,可先存入變數。strpos() 核心陷阱在於 0 與 false 的鬆散比較混淆,養成 !== false 或 === false 嚴格比較習慣即可避免 Bug。希望本文對您的 PHP 程式設計有所幫助。