查看: 124|回复: 1

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

[复制链接]
发表于 3 小时前 | 显示全部楼层 |阅读模式
在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() 做通用包含检测。

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

使用道具 举报

发表于 3 小时前 | 显示全部楼层

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

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

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-12 15:10 , Processed in 0.027479 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部