如果 $needle 出现在 $haystack 中的任意位置,str_contains($haystack, $needle) 返回 true,否则返回 false。它是 PHP 8.0 新增的函数,区分大小写。
和 strpos() 不同,它返回真正的布尔值,所以不存在“在位置 0 找到却看起来像 false”的陷阱。
语法
str_contains(string $haystack, string $needle): bool
str_starts_with(string $haystack, string $needle): bool
str_ends_with(string $haystack, string $needle): bool
这三个函数都是 PHP 8.0 新增的,按字节比较,所以不需要 mb_ 版本也能正确处理日文、中文等 UTF-8 文本。
用 str_starts_with 和 str_ends_with 检查开头或结尾
不区分大小写的包含判断
PHP 没有 str_icontains()。先把两个字符串都转成小写。mb_strtolower() 还能转换 ASCII 以外的字母,比如 É 或西里尔字母,而 strtolower() 不会处理它们。
空的查找内容返回 true
空字符串在任何字符串里都能找到,包括空字符串本身。如果查找内容来自用户留空的搜索框,这一点就很重要。
判断字符串是否包含多个词中的任意一个或全部
str_contains() 只接收一个查找内容。遍历一个数组:判断“任意一个”时,一旦匹配就返回;判断“全部”时,一旦不匹配就返回。
如果要检查某个值是不是数组的元素之一,而不是字符串的子串,用 in_array()。
PHP 8 之前:strpos !== false
需要在 PHP 7 上运行的代码会用 strpos() 加严格比较。它的结果和 str_contains() 相同,只有空的查找内容例外:PHP 7 的 strpos() 会打印 Warning: strpos(): Empty needle 并返回 false。
最后一行打印 bool(false),尽管文本明明在里面,因为 php 位于位置 0。把这类判断换成 str_contains() 是升级到 PHP 8 最容易的改进之一。
常见问题
PHP 中怎么判断一个字符串是否包含某个词?
PHP 8 中用 str_contains($haystack, $needle),它返回 true 或 false:str_contains('Hello world', 'world') 是 true。PHP 7 中用 strpos($haystack, $needle) !== false。
str_contains 区分大小写吗?
区分。要不区分大小写,先把两边都转成小写:str_contains(mb_strtolower($haystack), mb_strtolower($needle)),或者用 stripos($haystack, $needle) !== false。
为什么 str_contains 对空字符串返回 true?
每个字符串都包含空字符串,所以 str_contains('abc', '') 返回 true。如果要查找的内容来自用户输入,先检查它是不是空的。
PHP 中怎么判断字符串是否以某段内容开头或结尾?
用 str_starts_with($s, 'http') 和 str_ends_with($s, '.pdf'),两者都是 PHP 8.0 新增的。和 str_contains() 一样,它们区分大小写,返回布尔值。