注: 作者说的应用场景只是举例说明, 不代表只有这么一种解决问题的方案, 也不代表是最优解, 只是讲解这个函数的一个案例而已.
第 1 例
strstr($haystack, $needle) 与 strpos($haystack,$needle)
应用场景
你需要查找出一段已知字符串中是否存在 @符号, 你是不是会有疑惑 "你特么都说是已知字符串了, 有没有 @符号劳资一眼不就看出来了!", 如果你有此疑问那么劳资也很遗憾你竟然是这样的程序员!
函数解释
- // 查找字符串中子串的首次出现
- strstr($haystack, $needle)
- -- Find the first occurrence of a string
- // 查找字符串中子串首次出现的位置
- strpos($haystack,$needle)
- -- Find the position of the first occurrence of a substring in a string
乍一看这两个函数压根儿没什么区别呀, 但是请注意 strpos 强调的是位置, 它的返回值就包括子串首次出现的位置或者 false!
而 strstr 并没有强调位置, 只把话说了一半, 它的返回值就是如果查找到了子串就返回子串, 查找不到就返回 false!
这两个函数我们都可以用来去判断一个字符串中是否存在某个子串说白了就是去判断有没有我们要找的字符如 @, 但是这里有个值得注意的地方, 敲黑板! 划重点! 字符串位置是从 0 开始, 而不是从 1 开始的. 我为什么会说这句话会是重点呢? 如上所说 strpos 强调的是位置, 如果子串出现的位置是第一个, 那么它的位置就是 0, 如果你在 if 语句中使用 if ($result == false) 这类语句你就中招了, 因为 1 是真, 0 是假, 那么你得到的结果将会是 0 == false
我觉得说到这里也就差不多了, 我们来写几行代码看一看.
- <?PHP
- $haystack_string = 'abcdefg@hijk';
- $needle_string = '@';
- print_r(strstr($haystack_string, $needle_string));
这里的返回值是:@hijk
我们把函数换成 strpos 再来看返回值
- <?PHP
- $haystack_string = 'abcdefg@hijk';
- $needle_string = '@';
- print_r(strpos($haystack_string, $needle_string));
这里的返回值是: 7
很高兴, 这两个函数都满足了我们应用场景提出的需求, 接下来我们继续扩展一下, 我们来查找 a
- <?PHP
- $haystack_string = 'abcdefg@hijk';
- $needle_string = 'a';
- $result = strstr($haystack_string, $needle_string);
- if ($result){
- print_r('找到了! 当前返回值是:' . $result);
- }else{
- print_r('没找到! 当前返回值是:' . $result);
- }
这里的返回值是: 找到了! 当前返回值是: abcdefg@hijk
我们把函数换成 strpos 再来看返回值
- <?PHP
- $haystack_string = 'abcdefg@hijk';
- $needle_string = 'a';
- $result = strpos($haystack_string, $needle_string);
- if ($result){
- print_r('找到了! 当前返回值是:' . $result);
- }else{
- print_r('没找到! 当前返回值是:' . $result);
- }
这里的返回值是: 没找到! 当前返回值是: 0
这里就是我刚才 敲黑板! 提到的问题所在, 因为 a 是第一个出现的, 它的下标是 0, 而 0 == false, 所以就出现了这样的情况, 如果你坚持想要使用 strpos, 请记住要养成使用 === 或者 !== 的习惯.
来源: http://www.jianshu.com/p/5b55019e43e2