登录
首页 >  文章 >  php教程

PHP判断字符串是否包含子串的方法

时间:2026-05-23 22:59:07 485浏览 收藏

本文深入解析了PHP中判断字符串是否包含子串的多种方法,强调str_contains()(PHP 8.0+)为最简洁、安全、高效的首选方案;针对旧版本,推荐使用严格比较的mb_strpos()(UTF-8安全)而非易出错的strpos()裸用,并明确指出preg_match()在简单包含判断中属于过度设计、性能差且风险高——帮你避开常见陷阱,写出语义清晰、兼容稳健、真正可靠的字符串匹配代码。

PHP怎么检测字符串是否包含某子串【说明】

str_contains() 最直接,但要注意 PHP 版本

PHP 8.0+ 原生支持 str_contains(),它专为子串检测设计,语义清晰、性能好、不区分大小写(需手动处理)。低于 8.0 就不能用,强行调用会报 Fatal error: Uncaught Error: Call to undefined function str_contains()

  • ✅ 推荐写法(PHP ≥ 8.0):str_contains($haystack, $needle),返回 truefalse
  • ⚠️ 注意 $needle 不能为空字符串,否则 PHP 8.2+ 会触发 Warning: str_contains(): Empty needle
  • ❌ 不要用 strpos($str, 'abc') !== false 来“兼容旧版”——它可读性差,且容易漏掉 === 0 的边界判断

stripos()strpos() 的区别与误用点

这两个函数返回位置索引,不是布尔值。很多人直接当“是否包含”用,却忘了 0 是合法位置(子串在开头),false 才是没找到——所以必须用严格比较 !== false,不能用 != false== true

  • strpos() 区分大小写;stripos() 不区分,但性能略低
  • 常见错误写法:if (strpos($str, 'ABC')) { ... } —— 当子串在开头时,strpos 返回 0,条件直接失败
  • 正确写法:if (strpos($str, 'ABC') !== false) { ... }
  • 如果只关心存在性,不用位置,优先选 str_contains()(8.0+)或封装一层逻辑,别裸用 strpos

多字节字符串(如中文、emoji)不能用 strpos 直接判断

PHP 默认的 strpos/stripos 是按字节操作的,遇到 UTF-8 编码的中文或 emoji 时,可能切在中间,导致匹配失败或乱码。例如 strpos('你好', '好') 理论上该成功,但实际行为不可靠。

  • ✅ 正确做法:用 mb_strpos($str, $needle, 0, 'UTF-8'),并显式指定编码
  • ⚠️ mb_strpos() 返回 false 表示未找到,同样要严格比较 !== false
  • ? 如果项目已统一用 UTF-8 且启用了 mbstring.func_overload(不推荐),才可能让普通函数自动支持多字节——但这属于隐藏依赖,极易出问题,别依赖

正则 preg_match() 是过度设计,除非要模糊匹配

单纯判断“是否包含某固定子串”,完全不需要正则。用 preg_match('/abc/', $str) 不仅慢,还引入 PCRE 开销和转义风险(比如 $needle.*[ 就得先 preg_quote())。

  • ✅ 只在需要通配、边界控制(如单词边界 \babc\b)、或大小写混合策略时,才考虑 preg_match()
  • ❌ 把 preg_match()str_contains() 的降级方案,是典型工具误用
  • 性能对比(简单子串):str_contains()mb_strpos() < strpos() << preg_match()
字符串是否包含子串这件事,看着简单,但版本、编码、空值、类型比较这四点,任何一个没对齐,结果就不可靠。尤其线上环境 PHP 版本和 mbstring 扩展状态,建议先用 phpversion()extension_loaded('mbstring') 检查清楚再选函数。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《PHP判断字符串是否包含子串的方法》文章吧,也可关注golang学习网公众号了解相关技术文章。

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>