一、前方有坑

php某些自带函数,如果使用不当,也会坑得你人仰马翻。比如:strpos()

先了解一下strpos()函数是干啥的。

strpos — 查找字符串首次出现的位置

用法: int strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )

看下面代码:

$a = 'abcd';

$b = 'b';

$c = 'a';

echo strpos($a,$b) ? '原来是兄弟<br/>' : '非我族类,砍ta<br/>';

echo strpos($a,$c) ? '原来是兄弟<br/>' : '非我族类,砍ta<br/>';

echo strpos($a,$c)!=false ? '原来是兄弟' : '非我族类,砍ta';

结果显示

原来是兄弟

非我族类,砍ta

非我族类,砍ta

$c 命名是$a的一部分,结果当成异类,连着被砍了两次,冤枉,引发了一场本是同根生,相煎何太急的血案悲剧!

二、防坑攻略

stripos()返回的是字符串在另一个字符串出现的位置,而这个位置是从0开始计算的。$c在$a中出现的位置是0,因此被砍。

所以,正确的判断应该是:

$a = 'abcd';

$c = 'a';

echo strpos($a,$c)!==false ? '原来是兄弟' : '非我族类,砍ta';

三、为啥有坑

防坑攻略里说了一些原因,这里先充分了解strpos()函数说起。

用法:int strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )

参数:

  • haystack 在该字符串中进行查找。

  • needle 如果 needle 不是一个字符串,那么它将被转换为整型并被视为字符的顺序值。

  • offset 可选的 offset 参数可以用来指定从 haystack 中的哪一个字符开始查找。返回的数字位置是相对于 haystack 的起始位置而言的。

返回值

以整型返回位置信息。如果没找到 needle,strpos() 将返回布尔型的 FALSE 值。

也就是说,此函数可能返回布尔值 FALSE,但也可能返回等同于 FALSE 的非布尔值,例如 0 或 ""(空串)。因此,在判断的时候,需要使用恒等于’===‘或者恒不等于’===‘来判断,千万不能省去一个’=‘号。

四、防坑扩展:

1、类似的函数还有

strrpos() - 计算指定字符串在目标字符串中最后一次出现的位置

stripos() - 查找字符串首次出现的位置(不区分大小写)

strripos() - 计算指定字符串在目标字符串中最后一次出现的位置(不区分大小写)

2、判断一个字符串是否在另一个字符串中还有一个函数:strstr()。与strpos()有一点不同是,该函数的返回值是false或者字符串的一部分。如果单纯的判断两个字符串的包含关系,最好使用strpos,因为速度更快、耗费内存更少。

php踩过的那些坑(2) strpos引发的血案的更多相关文章

  1. SpringMVC踩的第一个坑——Servlet.init()引发异常

    正确的设置了第一个SpringMVC相关的配置,初始启动服务器时,报404,经过排查,是项目生成构建的时候没有导入好依赖,手动在项目结构里面新建lib目录添加依赖解决了404的问题,重新部署以后开始报 ...

  2. 三分之一的程序猿之社交类app踩过的那些坑

    三分之一的程序猿之社交类app踩过的那些坑 万众创新,全民创业.哪怕去年陌生人社交不管融资与否都倒闭了不知道多少家,但是依然有很多陌生人社交应用层出不穷的冒出来.各种脑洞大开,让人拍案叫起. 下面我们 ...

  3. 【Fine原创】JMeter分布式测试中踩过的那些坑

    最近因为项目需要,研究了性能测试的相关内容,并且最终选用了jmeter这一轻量级开源工具.因为一直使用jmeter的GUI模式进行脚本设计,到测试执行阶段工具本身对资源的过量消耗给性能测试带来了瓶颈, ...

  4. 与webview打交道中踩过的那些坑

    随着HTML5被越来越多的用到web APP的开发当中,webview这一个神器便日渐凸显出重要地位.简要的说,webview能够在移动应用中开辟出一个窗口,在里面显示html页面,css以及js代码 ...

  5. 美团在Redis上踩过的一些坑-目录(本人非美团)(转)

    来自:http://carlosfu.iteye.com/blog/2254154 分为5个部分:    一.周期性出现connect timeout    二.redis bgrewriteaof问 ...

  6. 安装python爬虫scrapy踩过的那些坑和编程外的思考

    这些天应朋友的要求抓取某个论坛帖子的信息,网上搜索了一下开源的爬虫资料,看了许多对于开源爬虫的比较发现开源爬虫scrapy比较好用.但是以前一直用的java和php,对python不熟悉,于是花一天时 ...

  7. [原创]阿里云RocketMQ踩过的哪些坑

    由于公司的最近开始使用RocketMQ来做支付业务处理, 便开启了学习阿里云RocketMQ的学习与实践之路, 其中踩了不少的坑, 大部份是由于没有仔细查看阿里云的技术文档而踩的坑. 但是有一个非常大 ...

  8. Spring Cloud 升级最新 Finchley 版本,踩了所有的坑!

    Spring Boot 2.x 已经发布了很久,现在 Spring Cloud 也发布了 基于 Spring Boot 2.x 的 Finchley 版本,现在一起为项目做一次整体框架升级. 升级前 ...

  9. Redis上踩过的一些坑

    来自: http://blog.csdn.net//chenleixing/article/details/50530419 上上周和同事(龙哥)参加了360组织的互联网技术训练营第三期,美团网的DB ...

随机推荐

  1. [2018-07-4] django笔记

    新建app python ..\venv\scripts\django-admin.py startapp cy python manage.py makemigrations python mana ...

  2. 吉利WA数

  3. 超出隐藏兼容H5

    常用的字体超出隐藏不能兼容H5和ios 所以整理了两种用jquery来实现的方法,然后弊端是只能隐藏指定字数不能段落隐藏 方法一. //超出隐藏兼容iosfunction hide(text,nube ...

  4. php imagick设置图片圆角的方法

    php imagick设置图片圆角的方法 <pre>header('Content-Type: image/png'); $image = new Imagick('http://stat ...

  5. 关于设备与canvas画不出来的解决办法

    连续四天解决一个在三星手机上面画canvas的倒计时饼图不出来的问题,困惑了很久,用了很多办法,甚至重写了那个方法,还是没有解决,大神给的思路是给父级加 "overflow: visible ...

  6. Docker学习-VMware Workstation 本地多台虚拟机互通,主机网络互通,解决name or service not known

     NAT网络通用配置 测试连接 主机到虚拟机 虚拟机到虚拟机 ,虚拟机到外网 CentOS,提示name or service not known 设置DNS服务器 vi /etc/resolv.co ...

  7. 理解clientWidth,offsetWidth,clientLeft,offsetLeft,clientX,offsetX,pageX,screenX

    1. clientWidth:表示元素的内部宽度,以像素计.该属性包括内边距,但不包括垂直滚动条(如果有).边框和外边距.(clientWidth = width + padding) 2. offs ...

  8. P0-Logisim简单部件与有限状态机

    #自学了6week,pre都挂了,做了做P0课下测试,觉得自己对有限状态机概念的的理解,特别是牵扯到时序还是很模糊:状态的抽象也不够熟练:logisim和Verilog的实现也存在问题.网上针对性的l ...

  9. 【前端知识体系-CSS相关】CSS特效实现之Transition和Transform对比

    CSS效果 1.使用div绘制图形(三角形)? <!DOCTYPE html> <html lang="en"> <head> <meta ...

  10. jeson navo

    QT TEMPLATE = app CONFIG += console c++11 CONFIG -= app_bundle CONFIG -= qt INCLUDEPATH += /usr/loca ...