字串查找是文本處理基礎操作,PHP 提供多種函數支援子字串定位、出現次數統計等需求,正確選擇關鍵在於「需要位置還是內容」與「大小寫敏感度」。
| 函數 | 功能 | 回傳值 | 大小寫敏感 | 對應不敏感版 |
|---|---|---|---|---|
strstr() | 首次出現位置到末尾的子字串 | 子字串 / false | 是 | stristr() |
strpos() | 首次出現位置索引 (0 起) | int / false | 是 | stripos() |
strrpos() | 最後出現位置索引 | int / false | 是 | strripos() |
substr_count() | 子字串出現次數 | int | 是 | - |
<?php
$email = 'user@example.com';
$domain = strstr($email, '@'); // '@example.com'
echo $domain;
// 只需檢查是否包含
if (strstr($haystack, $needle) !== false) { ... }
?>
<?php
$str = 'Hello World';
echo strpos($str, 'W'); // 6
echo strpos($str, 'x'); // false
// 嚴格判斷:必須用 !== false (0 也是 false)
if (strpos($str, 'H') !== false) { echo 'Found at 0'; }
?>
<?php
$text = 'ababababa';
echo substr_count($text, 'aba'); // 2 (不重疊計數)
echo substr_count($text, 'ab'); // 4
?>
<?php
$str = '中文測試字串';
echo mb_strpos($str, '測試', 0, 'UTF-8'); // 6 (字符索引)
echo mb_substr($str, mb_strpos($str, '測試', 0, 'UTF-8')); // '測試字串'
?>
<?php
$pattern = '/\b\d{3}-\d{4}\b/'; // 電話號碼格式
$text = '聯繫電話:02-1234-5678';
if (preg_match($pattern, $text, $matches)) {
echo $matches[0]; // 1234-5678
}
?>
| 需求 | 推薦函數 | 理由 |
|---|---|---|
| 只需判斷是否包含 | strpos() !== false | 最快,短路返回 |
| 需獲取匹配後內容 | strstr() | 直接返回子字串 |
| 需精確位置索引 | strpos() | 數值索引便於後續截取 |
| 統計出現次數 | substr_count() | 專用優化 |
| 模式匹配/複雜規則 | preg_match() | 正則表達式威力 |
| 中文/多位元組 | mb_strpos() 等 | 字符級正確 |
掌握各查找函數語義差異,避免「用 strstr 判斷包含」這類效能浪費,是 PHP 文本處理進階的標誌。