strpos() 返回 false 还是 0?这是最常翻车的地方
PHP 里查子字符串,
是首选,但它返回的是位置索引,不是布尔值。如果子串恰好在开头(索引为
),
返回
,而
会被当成
,结果误判为“没找到”。
必须用严格比较:
判断是否未找到,不能只用
或直接放在
里
正确写法:
错误写法:
注意大小写:它区分大小写;要忽略大小写,用
mb_strpos() 是中文或 UTF-8 字符串的刚需
如果你的字符串含中文、emoji 或其他多字节字符,
可能返回错位索引甚至乱码结果,因为它按字节操作,不识别 UTF-8 编码边界。
只要字符串可能含非 ASCII 字符(比如用户输入、数据库读出的中文),一律改用
记得设置内部编码:
,否则部分环境可能默认 GBK,导致行为不一致
参数顺序和
一致,但第四个参数可指定起始字节偏移(注意:是字节偏移,不是字符偏移)
示例:
str_contains() 是 PHP 8.0+ 最干净的写法
PHP 8.0 起原生支持
,语义清晰、不纠结返回值类型、自动处理编码(底层调用
当前 locale 合理时),适合新项目或已升级环境。
直接返回布尔值:
,无需
判断
不兼容 PHP Fatal error: Uncaught Error: Call to undefined function str_contains()
如果需兼容旧版,可用 polyfill:
它不支持正则,纯字面量匹配;要模糊匹配还得回
preg_match() 什么时候才该上?
只有需要模式匹配(比如“以数字开头+字母结尾”“邮箱格式校验”)时,才轮到
。它比
慢得多,且正则写错容易引发回溯灾难。
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
立即学习
“
PHP免费学习笔记(深入)
”;
纯子串查找,别用
—— 写
不仅难读,还慢一倍以上
必须转义用户输入的搜索内容:
,否则
会导致意外交配
只关心“是否存在”,用
;要取全部匹配项,用
错误现象常见:
,多半是没
真正麻烦的从来不是“怎么写”,而是“在哪种编码、哪个 PHP 版本、面对什么来源的数据”下选对函数。比如一个从 MySQL utf8mb4 字段读出的字符串,在 PHP 7.4 环境里用
查中文,大概率静默失败——这种细节不盯住,线上就只能靠日志猜。
strpos()0strpos()0if (0)false=== false== falseifif (strpos($str, 'abc') !== false) { /* 找到了 */ }if (strpos($str, 'abc')) { /* 开头匹配时会跳过 */ }stripos()strpos()mb_strpos()mb_internal_encoding('UTF-8')strpos()mb_strpos($str, '你好', 0, 'UTF-8')str_contains()mb_strpos()str_contains($str, 'test')!== falsefunction_exists('str_contains') || function str_contains($haystack, $needle) { return mb_strpos($haystack, $needle) !== false; }preg_match()preg_match()strpos()preg_match()~\Qabc\E~preg_quote($user_input, '/')$user_input = 'a.b+c'preg_match()preg_match_all()Warning: preg_match(): Compilation failed: nothing to repeat at offset Xpreg_quote()strpos()