php 8.1 中统计字符串匹配次数首选 substr_count()(固定子串,高效非重叠)或 preg_match_all()(正则模式,支持 unicode);大小写不敏感需预处理,重叠匹配需手动循环实现。

PHP 8.1 中统计字符串中某内容的匹配次数,主要用两个函数:`substr_count()` 适合简单子串计数,`preg_match_all()` 适合带规则、带模式或需 Unicode 支持的场景。选哪个取决于你要查的是“固定文本”还是“符合某种规律的一类内容”。
用 substr_count 统计固定子串出现次数
这是最轻量、最快的方式,适用于查找完全相同的子字符串,比如统计 “abc” 在一段文本里出现了几次。
- 区分大小写,不支持通配或正则,但性能高、语法简洁
- 可指定起始位置($offset)和搜索长度($length),灵活控制范围
- 不计算重叠匹配 —— 例如在
"aaaa"中查"aa",结果是 2(位置 0–1 和 2–3),不是 3
示例:
代码片段$text = "ababababa"; $count = substr_count($text, "aba"); // 返回 3(非重叠:位置0、2、4)
用 preg_match_all 统计正则匹配次数
当你要统计的不是固定文本,而是符合某种模式的内容时,比如“所有中文字符”“连续3位数字”“邮箱中的@符号”,就得用正则配合 preg_match_all。
- 返回实际匹配的**次数**(整数),不是数组长度;匹配内容存在
$matches[0]中 - 必须加 /u 修饰符处理 UTF-8 字符(如汉字、emoji)
- 常用模式举例:
'/\p{Han}/u'(汉字)、'/[a-z]+/i'(忽略大小写的英文单词)、'/\d{3}/'(三位数字)
示例:
代码片段$str = "Hello 世界 123 abc 你好456";
// 统计汉字个数
$countCN = preg_match_all('/\p{Han}/u', $str, $m); // 返回 4
// 统计纯数字组(至少1位)
$countNumGroups = preg_match_all('/\d+/', $str, $m); // 返回 3("123", "456",注意"abc456"里的456也算)
大小写不敏感?先转小写再用 substr_count
substr_count 本身不支持 flag,但实现忽略大小写很简单:统一预处理即可。
- 对主串和子串都用
strtolower()或mb_strtolower()(推荐后者,兼容多字节) - 避免用正则只是为了大小写切换——没必要增加开销
示例:
代码片段$text = "Apple apple APPLE"; $needle = "apple"; $count = substr_count(mb_strtolower($text), mb_strtolower($needle)); // 返回 3
需要重叠匹配?手动循环 + strpos
如果业务要求像 "aaaa" 中查 "aa" 得到 3 次(位置 0、1、2),`substr_count` 不行,得自己遍历。
- 用
strpos($haystack, $needle, $offset)逐次查找,每次从上一匹配的 下一个位置 开始 - 注意检查返回值是否为
false,避免死循环
示例:
代码片段function substr_count_overlapping($haystack, $needle) {
if ($needle === '') return 0;
$count = 0;
$offset = 0;
while (($pos = strpos($haystack, $needle, $offset)) !== false) {
$count++;
$offset = $pos + 1; // 关键:+1 而不是 + strlen($needle),实现重叠
}
return $count;
}
echo substr_count_overlapping("aaaa", "aa"); // 输出 3php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











