PHP中strchr、strrchr、strpos、strrpos区别

本文介绍了PHP中用于字符串查找的四个函数:strchr、strrchr、strpos及strrpos的使用方法与示例,帮助读者掌握如何高效地在字符串中定位特定字符或子串。

1、strchr(同strstr)

      strchr(string $haystack , mixed $needle [, bool $before_needle = false ] )查找字符串在指定字符串中的首次出现

      返回从第一次出现的位置到haystack 结束的字符串或false(没有找到needle)

      $haystack  被查找的字符串

      $needle   要查找的字符串(如果不是字符串,将被转化成整型并且作为字符的序号来使用)

      $before_needel  控制返回结果,如果为true返回第一次出现到haystack 开始的字符串(不包含needle)

      示例:

                strchr('hello world!','wor')    返回world!

                strchr('name@example.com','@',true)  返回name

2、strrchr

     strrchr(string $haystack , mixed $needle)查找字符串在指定字符串中的最后一次出现

      返回最后一次出现的位置到haystack 结束的字符串或false(没有找到needle)

      $haystack  被查找的字符串

      $needle   要查找的字符串(如果不是字符串,将被转化成整型并且作为字符的序号来使用)

      示例:

                strrchr('hello world world!','world')  返回world!

3、strpos

     strpos(string $haystack , mixed $needle [, int $offset = 0 ])查找字符串在指定字符串中首次出现的位置

     返回字符串 haystack 中 needle 最后一次出现的数字位置(如果$offset为正数,从左边第0个开始,如果为负数,从右边第1个开始),如果没找到needle,返回false

      $haystack  被查找的字符串

      $needle   要查找的字符串(如果不是字符串,将被转化成整型并且作为字符的序号来使用)

      $offset  如果提供了此参数,搜索会从字符串偏移了|$offset|后开始统计(控制从字符串什么位置开始查找)。如果为负数,表示从后向前开始数|$offset|后(可以理解为最大匹配到从右边第$offset位,不是删除的意思),查找字符串第一次出现的位置。

      注意:strpos函数的$offset参数在PHP7.1以后生效

      示例:

                strpos('hello world world','wor')   返回6//从0开始数,w字符为第6位

                strpos('hello world world','wor',10)  返回12//从第10个开始数,w字符为第12位(第二个w)

                strpos('hello world world','w',-12)  返回false//从右边开始数,数12位后(从1计数),再查找,返回false

4、strrpos

     strpos(string $haystack , mixed $needle [, int $offset = 0 ])查找字符串在指定字符串中最后一次出现的位置

     返回字符串 haystackneedle 最后一次出现的数字位置(如果$offset为正数,从左边第0个开始,如果为负数,从右边第1个开始),如果没有找到返回false

      $haystack  被查找的字符串

      $needle   要查找的字符串(如果不是字符串,将被转化成整型并且作为字符的序号来使用)

      $offset  或许会查找字符串中任意长度的子字符串。负数值将导致查找在字符串结尾处开始的计数位置处结束。

      示例:

              strrpos('AAABBBCCCDDD','DDD') //返回9,最后一次出现的位置为9

              strrpos('AAABBBCCCDD','DDD')//返回false,指定字符串中没有字符串'DDD'

             strrpos('AAABBBCCCDDDD','DDD',-2)//返回10,最大匹配到从有边数第2个,不会再进行匹配(不是删除最后两个D,如果是这样的话,匹配不到DDD,会返回false)

             strrpos('AAABBBCCCDDDD','DDD',-4)//返回9,最大匹配到从有边数第2个,不会再进行匹配

       总结:如果只是想判断$needle是否存在于$haystack中,使用strpos或strrpos,因为它速度更快,耗费内存更少

                 可以使用strrpos($haystack,$needle,-strlen($haystack))用于查找$needle是否位于$haystack开头,返回值应该用===比较,因为如果返回0和false在==时效果相同(PHP7.1以下strpos不支持$offset参数)



### `strrchr` 与 `strchr` 函数之间的区别 `strrchr` 和 `strchr` 是 C 语言标准库 `<string.h>` 中用于字符串处理的函数,它们的主要区别在于搜索方向和返回结果的定位。 `strchr` 用于在指定的字符串 `s` 中,从左向右查找字符 `c` 的第一次出现位置,并返回指向该字符的指针。如果未找到指定字符,则返回 NULL。例如,在字符串 `"www.qq.com"` 中查找字符 `'.'`,`strchr` 会返回指向第一个 `'.'` 的指针,输出为 `".qq.com"` [^3]。 ```c char *p = strchr("www.qq.com", '.'); printf("%s\n", p); // 输出 ".qq.com" ``` 而 `strrchr` 则用于在指定的字符串 `s` 中,从右向左查找字符 `c` 的最后一次出现位置,并返回指向该字符的指针。同样,如果未找到指定字符,则返回 NULL。以相同的字符串 `"www.qq.com"` 为例,查找字符 `'.'` 时,`strrchr` 会返回指向最后一个 `'.'` 的指针,输出为 `".com"` [^1]。 ```c char *p = strrchr("www.qq.com", '.'); printf("%s\n", p); // 输出 ".com" ``` 这两个函数在处理字符串时都包括字符串结束符 `'\0'` 的检查。例如,当使用 `strchr` 查找字符时,如果字符 `c` 是 `'\0'`,则函数会返回指向字符串末尾 `'\0'` 的指针 [^3]。 ### 应用场景 `strchr` 通常用于需要从字符串的起始位置开始查找特定字符的场景,例如解析 URL 或文件路径中的分隔符。而 `strrchr` 更适合查找字符串中最后一个出现的字符,例如提取文件名的扩展名或查找字符串中的最后一个分隔符 [^2]。 例如,在解析文件路径时,如果需要获取文件的扩展名,可以使用 `strrchr` 来查找最后一个 `'.'` 字符的位置,并返回其后的子字符串: ```c char path[] = "/home/user/file.txt"; char *ext = strrchr(path, '.'); if (ext != NULL) { printf("Extension: %s\n", ext); // 输出 ".txt" } ``` 在查找字符串中特定字符的索引位置时,可以通过计算返回指针与原始字符串的偏移量来实现。例如,查找字符 `'o'` 在字符串 `"Hello World"` 中的最后一个出现位置,并计算其索引: ```c #include <stdio.h> #include <string.h> int main() { char str[] = "Hello World"; char *pos = strrchr(str, 'o'); if (pos != NULL) { printf("Last 'o' found at index: %ld\n", pos - str); // 输出 "8" } return 0; } ``` 这种特性使得 `strrchr` 和 `strchr` 在字符串处理中具有广泛的用途,包括但不限于字符串分割、格式校验和路径解析 [^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值