php 8.0+ 用 str_contains() 判断子串,返回布尔值,空 needle 恒为 true;低版本用 strpos() 需严格比较 !== false;忽略大小写优先用 stripos(),中文场景用 mb_stripos();正则仅用于复杂模式,动态关键词须 preg_quote() 转义。

用 str_contains() 判断字符串是否包含子串(PHP 8.0+)
PHP 8.0 起原生支持 str_contains(),这是最直接、语义最清晰的方式。它返回布尔值,不区分大小写需自行处理。
- 参数顺序是
str_contains($haystack, $needle),别把两个参数写反 - 如果
$needle为空字符串'',函数返回true—— 这是 PHP 的定义行为,但多数业务场景下需要提前校验 - 不支持正则,只做字面量匹配;若需模糊或模式匹配,得换其他函数
// ✅ 正确用法
if (str_contains($text, 'error')) {
// 处理含 error 的情况
}
// ❌ 错误:空 needle 可能引发逻辑意外
str_contains($text, ''); // 总是 true
PHP 7.x 或更低版本用 strpos() 配合严格比较
strpos() 是兼容性最广的选择,但必须用 === false 判断失败,用 == false 或直接取反会把位置 0(开头匹配)误判为“未找到”。
- 返回的是首次出现的**位置索引**,不是布尔值;开头匹配时返回
0 - 必须用全等判断:
strpos($text, 'log') === false,不能写成!strpos(...) - 区分大小写;如需忽略大小写,改用
stripos()
// ✅ 安全写法
if (strpos($text, 'warning') !== false) {
// 包含 warning
}
// ❌ 危险写法:'warning' 在开头时,!strpos(...) 为 true,逻辑翻转
if (!strpos($text, 'warning')) { ... } // 错!
需要忽略大小写?优先选 stripos() 而非 strtolower() + strpos()
用 stripos() 比先转小写再查快且省内存,尤其对长字符串。它和 strpos() 行为一致(返回位置、需严格比较),只是忽略大小写。
-
stripos()不支持多字节编码(如中文 UTF-8)的正确处理;含中文时可能出错 - 如果字符串含中文或不确定编码,且必须忽略大小写,考虑用
mb_stripos()(需启用 mbstring 扩展) - 别为了“统一风格”强行把所有查找都套
strtolower(),性能损耗明显,还可能因编码问题截断字符
正则匹配?preg_match() 适合复杂模式,但别为简单包含滥用
只有当你需要“以单词边界匹配”“前后有特定字符”“支持通配或重复”等需求时,才该用 preg_match()。纯判断是否含有固定词,它又慢又重。
- 正则中记得转义特殊字符,比如查
foo.bar要写成/foo\.bar/ - 用
/i修饰符实现忽略大小写,比手动转大小写更可靠 - 避免写
preg_match('/'.$keyword.'/')—— 若$keyword来自用户输入,必须用preg_quote($keyword, '/')转义,否则可能执行任意正则
// ✅ 安全的动态正则
$escaped = preg_quote($user_input, '/');
if (preg_match('/'.$escaped.'/i', $text)) { ... }
// ❌ 危险:未转义,可能注入正则元字符
preg_match('/'.$user_input.'/', $text);
实际项目里最容易被忽略的是空字符串判定和大小写敏感边界。特别是从用户表单取关键词做搜索时,trim() 和 !== '' 检查几乎每次都要加,不然 str_contains($text, ' ') 或 stripos($text, '') 会默默返回真。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











