[PHP] 检查是否包含指定字符串/模式时的注意事项

目录
介绍
我是网页团队的草壁。
我经常忘记 strpos() 和 preg_match() 的返回值,所以整理了一些要点作为提醒。本文
仅关注指定的字符串/模式是否包含在内,并且只解释了部分函数,因此有关每个函数的详细信息,请参阅手册。
全面的
比较值时,除非有特殊原因,否则请使用 === 和 !== 而不是 == 和 !=。
我们建议您查看类型比较表,尤其是在您发现 0 == FALSE 为 TRUE 时感到意外的情况下
目录
- 检查字符串是否包含指定的字符串
- 检查字符串是否包含指定的模式
- 从数组中提取符合特定模式的元素
检查字符串是否包含指定的字符串
strpos() [手册]
int strpos(string $heystack, mixed $needle)
争论
heystack:要搜索的字符串。needle
:要搜索的字符串。您可以指定字符串以外的类型,但是……(见下文)
返回值
返回 needle 首次出现在 heystack 中的位置(从 0 开始)。
如果 needle 不在 heystack 中,则返回 FALSE。
strpos($heystack, $needle) !== FALSE
你可以通过查看的值来检查是否存在。
注1
如果 needle 出现在 heystack 的顶部,则返回值为 0。
strpos($heystack, $needle) != FALSE
如果字符串出现在开头,则返回 FALSE。请务必同时比较字符串类型。
注2
在手册中
如果 needle 不是字符串,则将其转换为整数,并将其视为与该数字对应的字符。
然而,这
并不意味着
“如果 needle 不是字符串,则将其转换为整数,然后再转换回字符串”。 (尽管转换为整数是正确的。)
如果 needle 不是字符串,则将其视为与转换为整数后的 needle 对应的十进制 ASCII 码字符。
换句话说,以下两种写法并不等价:
strpos('2100', 100) strpos('2100', (string)(int)100) // needle 变成字符串 100
以下三者等效:
strpos('2100', 100) strpos('2100', chr((int)100)) strpos('2100', 'd')
为避免出现意外结果,除非有特殊情况,否则最好为 `need` 函数指定一个字符串。
有关 `chr()` 函数的更多信息,请参阅
PHP:chr - 手册
注3
如果将数组放入 needle 中,不会发生错误,但这并不意味着可以指定多个 needle;这只是意味着数组被强制转换为整数。
从 PHP 7.0 开始,将数组强制转换为整数,空数组返回 0,非空数组返回 1。
strstr() [手册]
此函数查找针首次出现的位置,并返回从该位置到字符串末尾的字符串。
如果未找到针,则返回 FALSE,因此可用于检查针是否存在,但不建议仅将其用于此目的。
注意:
如果您只想检查某个针是否在特定的干草堆中,请改用 strpos(),它速度更快,占用内存更少。
检查字符串是否包含指定的模式
preg_match() [手动]
int preg_match(string $pattern, string $subject)
返回值
如果主题中存在与模式匹配的字符串,则返回 1;否则返回 0;如果在匹配过程中发生错误,则返回 FALSE。
preg_match($pattern, $subject) === 1
只需确认是否为真即可。
注意事项
如果您需要区分无匹配项和错误,请注意 0 == FALSE 为 TRUE。
从数组中提取符合特定模式的元素
这里,数组
$input = ['first', 'second', 'third', 'fourth', 'fifth'];
我们来看一个例子,假设我们要从一个字符串中提取以“th”结尾的元素。
为此,使用 preg_grep() 函数很容易。
preg_grep() [手册]
array preg_grep(string $pattern, array $input)
返回值
展示了一个从输入中提取符合特定模式的元素的数组
:
preg_grep('/th$/', $input) // ['fourth', 'fifth']
这是
array_filter($input, function($s) { return preg_match('/th$/', $s) === 1; })
相当于
注意事项
如果将常量 PREG_GREP_INVERT 指定为 preg_grep() 函数的第三个参数,则会提取与不匹配的匹配过程中出错的元素也会被提取出来。换句话说,以下两种方法等效。
preg_grep('/th$/', $input, PREG_GREP_INVERT) array_filter($input, function($s) { return preg_match('/th$/', $s) !== 1; })
#没有定义常量来明确指定“提取与模式匹配的元素”,因此,如果要提取匹配的元素,请省略第三个参数或指定 0。
2