脚本专家 发表于 2026-6-12 12:00:00

PHP字符串包含检测:strpos/strstr/explode及中文处理技巧

在PHP开发中,判断一个字符串是否包含另一个子串是常见需求。PHP提供了多种函数实现这一功能,但它们的性能、大小写敏感性以及对中文的支持各不相同。本文总结并对比这些方法,帮助你在实际项目中做出正确选择。

1. strstr()
strstr() 函数用于搜索一个字符串在另一个字符串中的首次出现,并返回从匹配点开始的剩余部分。如果未找到,则返回 false。$email = 'user@example.com';
$domain = strstr($email, '@');
echo $domain; // 输出 @example.com
该方法适用于需要获取匹配后子串的场景,若只需要判断是否包含,还需额外检查返回值是否为 false。

2. stristr()
stristr() 与 strstr() 用法完全相同,唯一区别是 stristr() 不区分大小写。当需要忽略大小写进行匹配时,stristr() 是直接选择。

3. strpos()
strpos() 返回子串首次出现的位置(从0开始)。若未找到则返回 false。注意必须使用严格比较运算符 === 来检测 false,因为子串出现在位置0时,返回0在宽松比较中会被视为 false。$str = 'www.jb51.net';
if (strpos($str, 'jb51') !== false) {
    echo '包含jb51';
} else {
    echo '不包含jb51';
}
strpos() 执行速度通常比 strstr() 和 stristr() 更快,因为它只返回位置而非子串。然而,它对中文支持不佳,因为中文字符在UTF-8编码下占用多个字节,strpos() 按字节处理,可能得到错误的位置。

4. explode()
explode() 按指定分隔符拆分字符串,若拆分后数组元素个数大于1,则说明原字符串包含该分隔符。function check_str($str) {
    $needle = 'a';
    $tmparray = explode($needle, $str);
    return count($tmparray) > 1;
}
这种方法效率较低,因为 explode() 需要生成一个数组,仅在特殊场景下(如需要获取分割后的各部分)才推荐使用。

5. substr()
当需要判断字符串末尾或特定位置是否包含某个子串时,可用 substr() 截取对比。$str = "<p>some text .dll</p>";
if (substr($str, -8) == ".dll</p>") {
    echo substr($str, 0, -4);
}
这种方法适合固定位置的匹配,不适用于通用包含检测。

6. substr_count()
substr_count() 返回子串在原字符串中出现的次数。利用该次数可判断是否包含。function check_str($str, $substr) {
    $nums = substr_count($str, $substr);
    return $nums >= 1;
}
注意:substr_count() 也是按字节计算,对中文可能不准确。但它不返回位置,只统计次数,适合需要统计出现频率的场景。

总结:
- 性能优先且不涉及中文:推荐 strpos(),配合 === false 判断。
- 需要获取匹配后的子串:推荐 strstr() 或 stristr()(忽略大小写)。
- 处理多字节编码(如UTF-8中文):上述函数均不理想,建议使用 mb_strpos() 或 mb_substr_count()(原文未提及,此处仅提醒)。
- 不需要精确判断仅需检测包含:substr_count() 也可用,但开销略高。
- 避免滥用 explode() 和 substr() 做通用包含检测。

根据实际需求选择合适的方法,既能提升代码可读性,也能保证执行效率。

热心网友2 发表于 2026-6-12 12:05:00

Re: PHP字符串包含检测:strpos/strstr/explode及中文处理技巧

感谢分享,总结得很清晰实用。尤其在中文处理方面,提醒mb_系列函数非常关键,很多新手容易在这上面踩坑。另外,关于strpos和strstr的性能对比以及严格比较运算符的注意事项,也写得通俗易懂,对实际开发很有参考价值。

热心网友5 发表于 2026-6-19 18:20:01

Re: PHP字符串包含检测:strpos/strstr/explode及中文处理技巧

感谢楼主这么详细的总结!平时写 PHP 最常用 `strpos` 加 `===`,但确实常常忘了中文字符的问题,你提到 `mb_strpos` 也提醒了我。另外 `substr_count` 那点我之前没留意到按字节的坑,以后统计中文字符频率得改用多字节版。总结得很清晰,收藏了!

热心网友1 发表于 2026-6-19 20:30:03

Re: PHP字符串包含检测:strpos/strstr/explode及中文处理技巧

写得非常全面,感谢分享!总结得很清晰,尤其是对 strpos 要用 !== false 严格判断这一点,新手很容易踩坑。另外关于中文处理,如果项目里频繁遇到多字节字符串,确实建议直接上 mb_ 系列函数,或者用正则 /u 修饰符配合 preg_match,也能避免按字节偏移的问题。你提到 mb_strpos 作为提醒很及时,很多人会忽略这一点。
页: [1]
查看完整版本: PHP字符串包含检测:strpos/strstr/explode及中文处理技巧