函數對比表
| 函數 | 返回值 | 大小寫 | 多字節安全 | 速度 | 推薦場景 |
| strstr | 子串到結尾 / false | 敏感 | ❌ | 中 | 需獲取後綴內容 |
| stristr | 子串到結尾 / false | 不敏感 | ❌ | 中 | 不分大小寫搜索 |
| strpos | 位置 int / false | 敏感 | ❌ | 最快 | 純判斷存在性 |
| mb_strpos | 位置 int / false | 敏感 | ✅ | 快 | UTF-8 中文判斷 |
| preg_match | 1/0/false | 可選 | ✅ | 慢 | 複雜模式 |
代碼示範
<?php
$haystack = 'Hello World';
// 1. strstr
$domain = strstr($haystack, ' '); // ' World'
if (strstr($haystack, 'World')) { /* 存在 */ }
// 2. stristr (不分大小寫)
if (stristr($haystack, 'world')) { /* 存在 */ }
// 3. strpos (最快,嚴格判斷)
if (strpos($haystack, 'World') !== false) { /* 存在 */ }
// ❌ 錯誤:if (strpos(...)) 會在位置 0 時判為 false
// 4. 爆炸法(教學用,不推薦生產)
function containsExplode(string $haystack, string $needle): bool {
return count(explode($needle, $haystack)) > 1;
}
多字節安全最佳實踐
<?php
mb_internal_encoding('UTF-8');
$str = '包含中文的字符串';
if (mb_strpos($str, '中文') !== false) { /* 存在 */ }
if (mb_stripos($str, '中文') !== false) { /* 不分大小寫 */ } // PHP 8+
// 正則邊界匹配
if (preg_match('/\b中文\b/u', $str)) { /* 獨立詞 */ }
避坑指南
- 永遠用
!== false 判斷 strpos/mb_strpos。
- UTF-8 環境強制用
mb_* 系列,或開啟 mbstring.func_overload(PHP 8.2+ 移除)。
- 大數據高頻判斷考慮
Bloom Filter / Trie 樹。