| 參數 | 說明 |
$haystack | 被搜尋的字串(必填) |
$needle | 要搜尋的子字串(必填) |
$offset | 起始搜尋位元組位移(可選,預設 0) |
$length | 搜尋長度(可選,預設至字串結尾) |
回傳 $needle 在 $haystack 中不重疊出現的次數。區分大小寫。
基本用法範例
$str = "提供大量腳本代碼及腳本特效下載";
echo substr_count($str, "腳本"); // 3
echo substr_count($str, "腳本", 16); // 2 (從第 16 個位元組開始)
echo substr_count($str, "腳本", 16, 10); // 1 (從第 16 位元組起,長度 10 位元組)
重要特性與注意事項
- 位元組而非字元:
$offset 與 $length 以位元組為單位。多位元組編碼(UTF-8)下,一個中文字佔 3 位元組,需謹慎計算。
- 不重疊計數:
substr_count('aaa', 'aa') 回傳 1(而非 2),因第二個 aa 與第一個重疊。
- 空字串處理:
$needle 為空字串會拋出 ValueError(PHP 8.0+)或回傳 0(舊版)。
- 大小寫敏感:需不區分大小寫時,先統一轉換:
substr_count(strtolower($haystack), strtolower($needle))。
進階應用:UTF-8 安全計數
function substr_count_utf8($haystack, $needle, $offset = 0, $length = null) {
// 將位元組位移轉為字元位移
$haystack = mb_substr($haystack, 0, $offset, 'UTF-8') . mb_substr($haystack, $offset, $length, 'UTF-8');
return substr_count($haystack, $needle);
}
或直接使用 mb_substr_count(PHP 5.2+):
echo mb_substr_count("腳本腳本腳本", "腳本"); // 3,正確處理多位元組
效能比較
| 函式 | 編碼支援 | 速度 | 適用場景 |
substr_count | 單一位元組 | 最快 | ASCII、固定編碼、大量資料 |
mb_substr_count | 多位元組 (UTF-8 等) | 稍慢 | 中文、日文、Emoji 等多語言 |
preg_match_all | 正則表達式 | 最慢 | 複雜模式匹配 |
實務建議
- 純 ASCII/英文環境 → 直接用
substr_count,效能最佳。
- 含中文或多語言 → 改用
mb_substr_count,避免位元組偏移錯誤。
- 需計算重疊出現次數 → 使用
preg_match_all('/(?=pattern)/', $str) 正向前瞻。
- 大字串(>1MB)高頻呼叫 → 考慮預先建立索引或使用外部搜尋引擎。
- 上一篇文章: PHP 圖片裁剪縮略類:多模式支援與透明背景處理
- 下一篇文章: PHP strstr() 函式:取得指定字串後所有內容的實戰技巧
Copyright ©
程式碼之家 All Rights Reserved