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

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
加载中...
2 票,平均:1.00 / 12
8,484
X Facebook 哈特纳书签 口袋

写这篇文章的人

关于作者