strpos – 查找字符串首次出现的位置,strpos() 函数对大小写敏感(区分大小写)。
stripos – 查找字符串首次出现的位置(不区分大小写)
strrpos – 计算指定字符串在目标字符串中最后一次出现的位置(区分大小写)
strripos – 计算指定字符串在目标字符串中最后一次出现的位置(不区分大小写)
strpos
查找字符串首次出现的位置mixedstrpos(string$haystack,mixed$needle[,int$offset=0])1
在 PHP7 源码中该函数实现在string.c文件的1950行附近
参数说明
haystack在该字符串中进行查找。needle如果 needle 不是一个字符串,那么它将被转换为整型并被视为字符的顺序值。offset如果提供了此参数,搜索会从字符串该字符数的起始位置开始统计和 strrpos()、 strripos()不一样,这个偏移量不能是负数。
返回值
成功:返回 needle 存在于 haystack 字符串起始的位置(独立于 offset)失败:如果没找到 needle,将返回 FALSE。
注意字符串位置是从0开始,而不是从1开始的
此函数可能返回布尔值 FALSE,但也可能返回等同于 FALSE 的非布尔值应使用 === 运算符或 !== 来测试此函数的返回值
示例<?php
//忽视位置偏移量之前的字符进行查找
$newstring='abcdefabcdef';
$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='MynameisJay,age28';$needle=8;
var_dump(strpos($haystack,$needle));/*
结果是false,因为这里的$needl是数字8,不是字符8,PHP会转成相应的ASII
8的ASII是^H,自然是找不到的
*/?><?php $haystack='MynameisJay,age28';$needle=97;
var_dump(strpos($haystack,$needle));/*
结果是4,因为97的ASII是字母a,
*/?>
stripos
查找字符串首次出现的位置(不区分大小写)mixedstripos(string$haystack,string$needle[,int$offset=0])1
在 PHP7 源码中该函数实现在string.c文件的行附近该函数与 strpos 唯一的区别就是不区分大小写。其他可参考strpos<?php $haystack='MynameisJay,age28';$needle='A';
var_dump(stripos($haystack,$needle));/*
结果是4
*/?>
$findme='a';
$mystring1='xyz';
$mystring2='ABC';
$pos1=stripos($mystring1,$findme);
$pos2=stripos($mystring2,$findme);
//'a'当然不在'xyz'中
if($pos1===false){
echo"Thestring'$findme'wasnotfoundinthestring'$mystring1'";
}
//注意这里使用的是===。简单的==不能像我们期望的那样工作,
//因为'a'的位置是0(第一个字符)。
if($pos2!==false){
echo"Wefound'$findme'in'$mystring2'atposition$pos2";
}
?>
strrpos
计算指定字符串在目标字符串中最后一次出现的位置mixedstrrpos(string$haystack,mixed$needle[,int$offset=0])1
在 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
计算指定字符串在目标字符串中最后一次出现的位置(不区分大小写)mixedstrripos(string$haystack,mixed$needle[,int$offset=0])1
在 PHP7 源码中该函数实现在string.c文件的2137行附近该函数与 strrpos 唯一的区别就是不区分大小写。其他可参考strrpos<?php
$haystack='ababcd';
$needle='aB';
$pos=strripos($haystack,$needle);
if($pos===false){
echo"Sorry,wedidnotfind($needle)in($haystack)";
}else{
//结果找到了,位置为2
echo"Congratulations!\n";
echo"Wefoundthelast($needle)in($haystack)atposition($pos)";
}
?>
PHP strripos note #3
Suppose you just need a stripos function working backwards expecting that strripos does this job, you better use the following code of a custom function named strbipos:
functionstrbipos($haystack="",$needle="",$offset=0) {
// Search backwards in $haystack for $needle starting from $offset and return the position found or false
$len=strlen($haystack);
$pos=stripos(strrev($haystack),strrev($needle),$len-$offset-1);
return ( ($pos===false) ?false:$len-strlen($needle) -$pos);
}
// Test
$body="01234Xy7890XYz456xy90";
$str="xY";
$len=strlen($body);
echo"TEST POSITIVE offset VALUES IN strbipos
";
for ($i=0;$i
echo"Search in [$body] for [$str] starting from offset [$i]: [".strbipos($body,$str,$i) ."]
";
}
?>
Note that this function does exactly what it says and its results are different comparing to PHP 5 strripos function.
PHP strripos note #4
OK, I guess this will be the final function implementation for PHP 4.x versions ( my previous posts are invalid )
if(!function_exists("stripos")){
functionstripos($str,$needle,$offset=0){
returnstrpos(strtolower($str),strtolower($needle),$offset);
}/* endfunction stripos */
}/* endfunction exists stripos */
if(!function_exists("strripos")){
functionstrripos($haystack,$needle,$offset=0) {
if( !is_string($needle) )$needle=chr(intval($needle) );
if($offset
$temp_cut=strrev(substr($haystack,0,abs($offset) ) );
}
else{
$temp_cut=strrev( substr($haystack,0,max( (strlen($haystack) -$offset),0) ) );
}
if( ($found=stripos($temp_cut,strrev($needle) ) ) ===FALSE)returnFALSE;
$pos= (strlen($haystack) - ($found+$offset+strlen($needle) ) );
return$pos;
}/* endfunction strripos */
}/* endfunction exists strripos */
?>
PHP strripos note #5
Oops, I forgot to return "false" if the needle is not found. Here is the proper function.
if(!function_exists("strripos")){
functionstrripos($haystack,$needle,$offset=0) {
if($offset<0){
$temp_cut=strrev(substr($haystack,0,abs($offset) ) );
}
else{
$temp_cut=strrev(substr($haystack,$offset) );
}
$pos=strlen($haystack) - (strpos($temp_cut,strrev($needle)) +$offset+strlen($needle));
if ($pos==strlen($haystack)) {$pos=0; }
if(strpos($temp_cut,strrev($needle))===false){
returnfalse;
}
else return$pos;
}/* endfunction strripos*/
}/* endfunction exists strripos*/
?>