[PHP] 检查是否包含指定字符串/模式时的注意事项
目录
介绍
我是 WEB 团队的日下。
我经常忘记 strpos() 或 preg_match() 的返回值是什么并查找它,因此我用一些简单的注释进行了总结以供提醒。
重点仅在于是否包含指定的字符串/模式,并且只解释了部分函数,因此每个函数的详细信息请参阅手册。
总体上可以说些什么
比较值时,请使用 ===、!== 而不是 ==、!=,除非您有充分的理由这样做。
特别是如果您发现 0 == FALSE 变为 TRUE 感到惊讶,我们建议您查看类型比较表
目录
- 检查是否包含指定字符串
- 检查是否包含指定的模式
- 从数组中提取与模式匹配的元素
检查是否包含指定字符串
strpos() [手册]
int strpos(字符串$heystack,混合$needle)
争论
heystack:要搜索的字符串。
针:要搜索的字符串。也可以指定字符串以外的类型...(稍后描述)
返回值
返回在 heystack 中第一次出现的位置(从 0 开始)。
如果heystack中不包含needle,则返回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) // 针变成字符串 100
下面三个是等价的:
strpos('2100', 100) strpos('2100', chr((int)100)) strpos('2100', 'd')
为了避免出现意想不到的后果,除非有特殊情况,最好指定一根线作为针。
单击此处获取 chr()
PHP:chr - 手册
注3
如果将数组插入到needle中,则不会导致错误,但这并不意味着您可以指定多个needle;该数组将简单地转换为整数。
#从 PHP 7.0 开始,将数组转换为整数将导致 0 表示空数组,1 表示非空数组。
strstr() [手册]
该函数查找第一次出现的needle,并从那里返回到字符串的末尾。
如果未找到needle,则返回FALSE,因此可以用来检查是否存在,但不建议仅将此函数用于此目的。
注意:
如果您只是想检查特定的大海捞针中是否存在针,请使用 strpos(),它速度更快,占用的内存更少。
检查是否包含指定的模式
preg_match() [手册]
int preg_match(字符串$pattern, 字符串$subject)
返回值
如果主题中存在字符串匹配模式,则返回 1,否则返回 0,如果匹配过程中发生错误,则返回 FALSE。当检查是否存在时
preg_match($pattern, $subject) === 1
您所要做的就是检查是否为 TRUE。
注意事项
如果您需要区分不匹配和错误,请注意 0 == FALSE 会变为 TRUE。
从数组中提取与模式匹配的元素
这里是数组
$input = ['第一', '第二', '第三', '第四', '第五'];
考虑一个从 中提取以 th 结尾的元素的示例。
一个简单的方法是使用 preg_grep()。
preg_grep() [手册]
数组 preg_grep(字符串 $pattern, 数组 $input)
返回值
从输入元素中提取与模式匹配的元素的数组
:
preg_grep('/th$/', $input) // ['第四', '第五']
这是
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。