php中判断字符串包含子串应使用strpos()并严格比较!== false,避免0被误判;中文等多字节字符需用mb_strpos()并指定utf-8编码,数组筛选推荐array_filter()配合strpos(),复杂匹配才用preg_match()。

PHP中用 strpos() 判断字符串是否包含子串
直接用 strpos() 是最常用、最可靠的方式。它返回子串首次出现的位置(从0开始),没找到返回 false。注意:不能用 == 判断结果,必须用严格比较 === false,否则当子串在开头时(位置为 0)会被误判为“未找到”。
常见错误写法:if (strpos($str, 'abc') == false) —— 这会让 'abc123' 被当成不包含 'abc'。
正确做法:
$str = 'hello world';
if (strpos($str, 'world') !== false) {
echo '找到了';
}
- 区分大小写:默认敏感;如需忽略大小写,改用
stripos() - 只判断存在性,不关心位置时,
!== false是唯一安全的判断方式 - 对空字符串
''的搜索会始终返回0,需提前过滤
遍历数组查找含某字符串的元素(array_filter() + strpos())
如果目标是数组里“值中包含某字符串”的所有项,别手写 foreach,用 array_filter() 更简洁、语义清晰。
示例:从用户列表中找出邮箱含 'gmail' 的人
$users = [
['name' => 'Alice', 'email' => 'alice@gmail.com'],
['name' => 'Bob', 'email' => 'bob@outlook.com'],
];
$gmailUsers = array_filter($users, function($u) {
return strpos($u['email'] ?? '', 'gmail') !== false;
});
-
$u['email'] ?? ''防止键不存在导致警告 - 若需大小写无关匹配,把
strpos换成stripos - 返回的是带原键名的新数组,如需重置索引,外层套
array_values()
多条件或模糊匹配时,考虑 preg_match()
当查找逻辑变复杂——比如“包含 a 或 b,但不能以 c 开头”,或者要提取匹配内容本身,strpos() 就不够用了,该上正则。
简单含字符串检查也能用正则,但性能略低,仅在必要时使用:
if (preg_match('/\berror\b/i', $logLine)) {
// 匹配独立单词 'error',忽略大小写
}
-
/i表示忽略大小写,\b是单词边界,避免匹配到'errors'中的'error' - 正则比
strpos()开销大,纯子串查找没必要用 - 用户输入内容进正则前,务必用
preg_quote()转义,否则特殊字符(如.、*)会破坏模式
注意 mbstring 扩展对中文等多字节字符的影响
如果字符串含中文、日文等 UTF-8 多字节字符,且项目启用了 mbstring.func_overload(已废弃但旧配置可能残留),strpos() 可能按字节而非字符计算位置,导致错位或漏匹配。
稳妥做法:显式使用多字节函数
// 安全的中文子串查找
if (mb_strpos($text, '你好', 0, 'UTF-8') !== false) { ... }
- 始终指定编码(如
'UTF-8'),尤其当源数据编码不确定时 -
mb_stripos()对应大小写不敏感版本 - 检查是否启用 mbstring:
extension_loaded('mbstring'),未启用时退回到strpos()并确保字符串是 ASCII
实际项目里,中文搜索失败十有八九是没切到 mb_* 函数,而不是逻辑写错了。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











