PHP string contains:判断是否包含子串

对于 PHP string contains 判断,使用 str_contains() 可以测试一个字符串是否包含另一个字符串,并直接得到布尔结果。它适合守卫子句、路由判断和输入校验这类只关心是/否的场景。相比 strpos(),它避免了位置 0 被当作假值的陷阱,代码也不需要 !== false 才能保持清晰。str_contains() 在 PHP 8.0+ 可用。

PHP 字符串包含示例:检查子串

输出:

输出将显示在这里...

输出:

状态:已发货

这个示例如何工作

  1. $message 保存了一段普通字符串,用于表示状态信息。
  2. str_contains($message, "发货") 会在 haystack 中查找精确子串 "发货",因为该子串存在,所以返回 true
  3. 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() 的主要原因。