PHP string contains:判断是否包含子串
对于 PHP string contains 判断,使用 str_contains() 可以测试一个字符串是否包含另一个字符串,并直接得到布尔结果。它适合守卫子句、路由判断和输入校验这类只关心是/否的场景。相比 strpos(),它避免了位置 0 被当作假值的陷阱,代码也不需要 !== false 才能保持清晰。str_contains() 在 PHP 8.0+ 可用。
PHP 字符串包含示例:检查子串
输出:
输出将显示在这里...
输出:
状态:已发货
这个示例如何工作
$message保存了一段普通字符串,用于表示状态信息。str_contains($message, "发货")会在 haystack 中查找精确子串"发货",因为该子串存在,所以返回true。if代码块会执行,因为返回值本身就是布尔值,不需要再做类型混淆式比较。
什么是 PHP 中的 str_contains?
str_contains(string $haystack, string $needle): bool 是 PHP 8.0 提供的函数,用于执行大小写敏感、二进制安全的子串检查。当 $needle 在 $haystack 任意位置出现时返回 true,否则返回 false。空 $needle 始终返回 true,这是 PHP 规范里定义的行为,不是 bug。
str_contains() 常见错误
期望不区分大小写匹配
错误:
str_contains("Hello World", "hello"); // false
正确:
stripos("Hello World", "hello") !== false; // true
str_contains() 区分大小写。需要不区分大小写搜索时,使用 stripos() !== false(或先统一两边字符串大小写后再调用 str_contains())。
把 strpos() 当布尔值使用(迁移陷阱)
错误:
if (strpos("已发货", "已")) echo "匹配"; // 无输出(0 为假值)
正确:
if (strpos("已发货", "已") !== false) echo "匹配";
在 PHP 8+ 中,如果你只需要布尔结果,优先用 str_contains()。
str_contains 与 strpos 与 stripos 对比
| 函数 | 返回值 | 大小写 | PHP 版本 |
|---|---|---|---|
str_contains() | bool | 敏感 | 8.0+ |
strpos() | int|false | 敏感 | 4+ |
stripos() | int|false | 不敏感 | 5+ |
在 PHP 8+ 中只需要布尔判断时,使用 str_contains()。当你需要匹配位置或必须兼容 PHP 7.x 时,使用 strpos()。需要不区分大小写且同时要拿到匹配位置时,使用 stripos()(它和 strpos() 一样返回索引)。
常见问题
str_contains 区分大小写吗?
是。str_contains("PHP", "php") 会返回 false。若要不区分大小写判断,可以先对两个参数都用 strtolower(),再调用 str_contains(),或者使用 stripos($haystack, $needle) !== false。
为什么 str_contains 对空字符串返回 true?
按定义,空字符串是任何字符串的子串。这与 PHP 8 中 strpos("anything", "") 返回 0 的行为一致。如果空用户输入会导致错误逻辑,应在调用 str_contains() 前先做空值校验。
在 PHP 7 中如何检查字符串是否包含子串?
使用 strpos($haystack, $needle) !== false。这个严格比较很关键,因为当 needle 出现在开头时,strpos() 会返回 0,而在 PHP 里 0 会被当作假值。这也是后来引入 str_contains() 的主要原因。