在php中查找某个词出现的次数,最直接的方法是使用内置函数 substr_count()。该函数接受目标字符串和要搜索的子串作为参数,返回子串在字符串中非重叠出现的总次数。如果子串为空或不在字符串中,它会分别返回0或0。对于需要忽略大小写或处理复杂正则表达式的场景,可以使用 preg_match_all() 配合 i 修饰符。

substr_count() 如何处理重叠子串
substr_count() 默认统计的是非重叠出现次数。这意味着如果搜索的词本身包含重复结构(如 "aa" 在 "aaa" 中),它只会计算不重叠的部分。如果需要统计所有可能的重叠出现位置,必须使用正则表达式 preg_match_all()。

$text = "banana";
$search = "ana";
// 非重叠计数
$count1 = substr_count($text, $search);
var_dump($count1); // 输出: int(1)
// 重叠计数
$count2 = preg_match_all("/" . preg_quote($search, "/") . "/", $text);
var_dump($count2); // 输出: int(2)
在上述代码中,substr_count 将 "banana" 中的 "ana" 视为一次出现,因为它跳过了重叠部分。而 preg_match_all 通过正则匹配,识别出了索引1处的 "ana" 和索引3处的 "ana",共两次。注意 preg_quote 用于转义搜索词中的特殊字符,防止正则解析错误。
立即学习“PHP免费学习笔记(深入)”;
如何忽略大小写进行统计
当需要统计时不区分大小写,例如 "Apple" 和 "apple" 算作同一词,substr_count() 无法直接满足需求,需借助 preg_match_all() 并添加 i 修饰符。这种方法能准确处理混合大小写的文本。

$text = "Apple apple APPLE";
$search = "apple";
// 忽略大小写统计
$count = preg_match_all("/" . preg_quote($search, "/") . "/i", $text);
var_dump($count); // 输出: int(3)
此代码段展示了如何使用 /i 修饰符使正则表达式忽略大小写。无论原文本是 "Apple"、"apple" 还是 "APPLE",只要拼写一致,都会被计入总数。这比手动转换整个字符串为小写再调用 substr_count() 更高效且不易出错,因为后者会改变原始数据副本的处理逻辑。
当搜索词包含正则元字符时会发生什么
如果使用 preg_match_all() 而未对搜索词进行转义,且搜索词包含如 .、*、[ 等正则元字符,会导致匹配行为异常或报错。必须使用 preg_quote() 对这些字符进行转义,以确保它们被当作普通字符处理。
$text = "price is $10.00";
$search = "$10.00";
// 未转义:可能匹配任意字符而非字面量
$bad_count = preg_match_all("/" . $search . "/", $text);
// 正确转义
$good_count = preg_match_all("/" . preg_quote($search, "/") . "/", $text);
var_dump($good_count); // 输出: int(1)
在上面的例子中,$search 包含 $ 和 .。如果不使用 preg_quote,$ 可能被解释为行尾锚点,. 匹配任意字符,导致结果不准确甚至引发警告。preg_quote 自动在元字符前添加反斜杠,确保精确的字面量匹配。



















