Menu

PHP str_contains():判断字符串是否包含某段文本

只要 $needle 出现在 $haystack 中的任意位置,str_contains($haystack, $needle) 就返回 true。学习不区分大小写的写法、str_starts_with 和 str_ends_with、检查多个关键词,以及 PHP 7 中的 strpos 写法。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

如果 $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() 一样,它们区分大小写,返回布尔值。

Coddy 编程语言插图

和 Coddy 一起学编程

开始