首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP substr_count() 函式:計算子字串出現次數完整指南

     編輯:PHP 綜合知識

函式定義與參數

int substr_count(string $haystack, string $needle, int $offset = 0, int $length = null)

回傳 $needle 在 $haystack 中不重疊出現的次數。區分大小寫。

基本用法範例

$str = "提供大量腳本代碼及腳本特效下載";

echo substr_count($str, "腳本");        // 3
echo substr_count($str, "腳本", 16);    // 2 (從第 16 個位元組開始)
echo substr_count($str, "腳本", 16, 10); // 1 (從第 16 位元組起,長度 10 位元組)

重要特性與注意事項

  1. 位元組而非字元:$offset 與 $length 以位元組為單位。多位元組編碼(UTF-8)下,一個中文字佔 3 位元組,需謹慎計算。
  2. 不重疊計數:substr_count('aaa', 'aa') 回傳 1(而非 2),因第二個 aa 與第一個重疊。
  3. 空字串處理:$needle 為空字串會拋出 ValueError(PHP 8.0+)或回傳 0(舊版)。
  4. 大小寫敏感:需不區分大小寫時,先統一轉換: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,正確處理多位元組

效能比較

參數說明
$haystack被搜尋的字串(必填)
$needle要搜尋的子字串(必填)
$offset起始搜尋位元組位移(可選,預設 0)
$length搜尋長度(可選,預設至字串結尾)
函式編碼支援速度適用場景
substr_count單一位元組最快ASCII、固定編碼、大量資料
mb_substr_count多位元組 (UTF-8 等)稍慢中文、日文、Emoji 等多語言
preg_match_all正則表達式最慢複雜模式匹配

實務建議

  • 純 ASCII/英文環境 → 直接用 substr_count,效能最佳。
  • 含中文或多語言 → 改用 mb_substr_count,避免位元組偏移錯誤。
  • 需計算重疊出現次數 → 使用 preg_match_all('/(?=pattern)/', $str) 正向前瞻。
  • 大字串(>1MB)高頻呼叫 → 考慮預先建立索引或使用外部搜尋引擎。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved