PHP字符串函数之 strpos stripos strrpos strripos
- strpos – 查找字符串首次出现的位置
- stripos – 查找字符串首次出现的位置(不区分大小写)
- strrpos – 计算指定字符串在目标字符串中最后一次出现的位置
- strripos – 计算指定字符串在目标字符串中最后一次出现的位置(不区分大小写)
strpos
查找字符串首次出现的位置
mixed strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )
在 PHP7 源码中该函数实现在string.c文件的1950行附近
参数说明
haystack
在该字符串中进行查找。
needle
如果 needle 不是一个字符串,那么它将被转换为整型并被视为字符的顺序值。
offset
如果提供了此参数,搜索会从字符串该字符数的起始位置开始统计
和 strrpos()、 strripos()不一样,这个偏移量不能是负数。
返回值
成功:返回 needle 存在于 haystack 字符串起始的位置(独立于 offset)
失败:如果没找到 needle,将返回 FALSE。
注意
- 字符串位置是从0开始,而不是从1开始的
- 此函数可能返回布尔值 FALSE,但也可能返回等同于 FALSE 的非布尔值
应使用 === 运算符或 !== 来测试此函数的返回值
示例
<?php
// 忽视位置偏移量之前的字符进行查找
$newstring = 'abcdef abcdef';
$pos = strpos($newstring, 'a', 1); // $pos = 7, 不是 0
?>
<?php
$mystring = 'abc';
$findme = 'a';
$pos = strpos($mystring, $findme); //$pos = 0
// 注意这里使用的是 ===。简单的 == 不能像我们期待的那样工作,
// 因为 'a' 是第 0 位置上的(第一个)字符。
if ($pos === false) {
echo "没有找到字符串 '$findme' ";
} else {
echo "字符串 '$findme' 在字符串 '$mystring' 中被发现"
echo "在其中的位置是 $pos"; //$pos = 0
}
?>
<?php
$haystack = 'My name is Jay, age 28';
$needle = 8;
var_dump(strpos($haystack, $needle));
/*
结果是 false,因为这里的 $needl是数字8,不是字符8,PHP会转成相应的ASII
8的ASII是 ^H, 自然是找不到的
*/
?>
<?php
$haystack = 'My name is Jay, age 28';
$needle = 97;
var_dump(strpos($haystack, $needle));
/*
结果是 4,因为97的ASII是 字母a,
*/
?>
stripos
查找字符串首次出现的位置(不区分大小写)
mixed stripos ( string $haystack , string $needle [, int $offset = 0 ] )
在 PHP7 源码中该函数实现在string.c文件的2008行附近
该函数与 strpos 唯一的区别就是不区分大小写。其他可参考strpos
<?php
$haystack = 'My name is Jay, age 28';
$needle = 'A';
var_dump(stripos($haystack, $needle));
/*
结果是 4
*/
?>
strrpos
计算指定字符串在目标字符串中最后一次出现的位置
mixed strrpos ( string $haystack , mixed $needle [, int $offset = 0 ] )
在 PHP7 源码中该函数实现在string.c文件的2068行附近
参数说明
haystack
在该字符串中进行查找。
needle
如果 needle 不是一个字符串,那么它将被转换为整型并被视为字符的顺序值。
offset
如果提供了此参数,搜索会从字符串该字符数的起始位置开始统计,可以是负数
返回值
成功:返回 needle 存在于 haystack 字符串起始的位置(独立于 offset)
失败:如果没找到 needle,将返回 FALSE。
注意
- 字符串位置是从0开始,而不是从1开始的
- 此函数可能返回布尔值 FALSE,但也可能返回等同于 FALSE 的非布尔值
应使用 === 运算符或 !== 来测试此函数的返回值
示例
<?php
$foo = "012345678901234567890123456789";
//从尾部第 3 个位置开始查找,
//结果: int(27)
var_dump(strrpos($foo, '7', -3));
//从尾部第 4 个位置开始查找,
//结果: int(17)
var_dump(strrpos($foo, '7', -4));
//从第 20 个位置开始查找
//结果: int(27)
var_dump(strrpos($foo, '7', 20));
//结果: bool(false)
var_dump(strrpos($foo, '7', 28));
?>
可能有同学对上面的 -3那个例子看不明白
为什么上面的 -3,查找到的'7',最后出现的位置仍然是27,而不是17
这个-3该怎么计算呢?
其实很简单,我们观察一下$foo, 长度为30,在C语言中用字符数组来存的话就是0到29
在PHP内部是使用$foo的长度30加上偏移-3等于27,然后在字符数组0到27中来查找。
0到27也就是字符串 0123456789012345678901234567,所以为'7'最后一次出现的位置是27
strripos
计算指定字符串在目标字符串中最后一次出现的位置(不区分大小写)
mixed strripos ( string $haystack , mixed $needle [, int $offset = 0 ] )
在 PHP7 源码中该函数实现在string.c文件的2137行附近
该函数与 strrpos 唯一的区别就是不区分大小写。其他可参考strrpos
<?php
$haystack = 'ababcd';
$needle = 'aB';
$pos = strripos($haystack, $needle);
if ($pos === false) {
echo "Sorry, we did not find ($needle) in ($haystack)";
} else {
//结果找到了,位置为2
echo "Congratulations!\n";
echo "We found the last ($needle) in ($haystack) at position ($pos)";
}
?>