使用 substr_count() 函数可以直接统计子串在字符串中出现的次数。调用该函数时传入主字符串和待查找的子串,它会返回一个整数表示匹配的数量;如果子串为空或长度超过主串,则分别返回 0 或抛出警告。

substr_count() 遇到空输入会返回什么
当第二个参数(子串)为空字符串时,substr_count() 不会报错,而是直接返回 0。这是 PHP 的特定行为,旨在避免将空字符串视为无限次出现的情况。开发者在处理用户输入时,若未对子串进行非空校验,传入空值会导致统计结果意外归零,而非预期的错误提示。

$str = "hello"; $empty_sub = ""; $result = substr_count($str, $empty_sub); var_dump($result); // 输出 int(0)
上述代码展示了传入空子串的实际运行结果。变量 $result 被赋值为整数 0。这验证了函数对空子串的特殊处理逻辑:它不计算位置,也不抛出异常,而是静默返回零。在实际业务逻辑中,如果需要区分“未找到”和“空输入”,必须在使用 substr_count() 前显式检查子串长度。
重叠子串如何被统计
substr_count() 在统计重叠子串时,采用非重叠匹配策略。也就是说,一旦匹配成功,搜索指针会跳过已匹配的字符继续向后查找,而不是从下一个字符重新开始。这意味着对于像 “aaa” 中包含 “aa” 这样的场景,函数只会返回 1 而不是 2。这种行为与正则表达式中的贪婪匹配不同,也与某些其他语言库的行为存在差异。

$str = "aaaa"; $sub = "aa"; $count = substr_count($str, $sub); var_dump($count); // 输出 int(2)
在上面的代码中,主字符串为四个 'a',子串为两个 'a'。第一次匹配发生在索引 0 处(字符 0-1),第二次匹配发生在索引 2 处(字符 2-3)。由于每次匹配后指针移动了子串的长度(2个字符),因此总共检测到 2 次非重叠出现。如果希望统计所有可能的重叠出现次数,例如期望结果为 3,则需要借助正则表达式 /aa/g 配合 preg_match_all() 来实现,因为原生 substr_count() 不支持重叠计数。
基于程序中某个输入、条件或结果的具体问题
当主字符串长度小于子串长度时,substr_count() 会返回 0 并触发一个 E_WARNING 级别的警告。这是因为在物理上不可能在一个较短的字符串中找到一个较长的子串。开发者在日志中可能会看到此类警告,虽然不影响程序继续运行,但表明逻辑中存在无效的参数传递。正确的做法是在调用前确保子串长度不超过主串,或者捕获并忽略该警告,具体取决于业务需求是否允许这种无效状态存在。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











