php踩过的那些坑(2) strpos引发的血案
一、前方有坑
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引发的血案的更多相关文章
- SpringMVC踩的第一个坑——Servlet.init()引发异常
正确的设置了第一个SpringMVC相关的配置,初始启动服务器时,报404,经过排查,是项目生成构建的时候没有导入好依赖,手动在项目结构里面新建lib目录添加依赖解决了404的问题,重新部署以后开始报 ...
- 三分之一的程序猿之社交类app踩过的那些坑
三分之一的程序猿之社交类app踩过的那些坑 万众创新,全民创业.哪怕去年陌生人社交不管融资与否都倒闭了不知道多少家,但是依然有很多陌生人社交应用层出不穷的冒出来.各种脑洞大开,让人拍案叫起. 下面我们 ...
- 【Fine原创】JMeter分布式测试中踩过的那些坑
最近因为项目需要,研究了性能测试的相关内容,并且最终选用了jmeter这一轻量级开源工具.因为一直使用jmeter的GUI模式进行脚本设计,到测试执行阶段工具本身对资源的过量消耗给性能测试带来了瓶颈, ...
- 与webview打交道中踩过的那些坑
随着HTML5被越来越多的用到web APP的开发当中,webview这一个神器便日渐凸显出重要地位.简要的说,webview能够在移动应用中开辟出一个窗口,在里面显示html页面,css以及js代码 ...
- 美团在Redis上踩过的一些坑-目录(本人非美团)(转)
来自:http://carlosfu.iteye.com/blog/2254154 分为5个部分: 一.周期性出现connect timeout 二.redis bgrewriteaof问 ...
- 安装python爬虫scrapy踩过的那些坑和编程外的思考
这些天应朋友的要求抓取某个论坛帖子的信息,网上搜索了一下开源的爬虫资料,看了许多对于开源爬虫的比较发现开源爬虫scrapy比较好用.但是以前一直用的java和php,对python不熟悉,于是花一天时 ...
- [原创]阿里云RocketMQ踩过的哪些坑
由于公司的最近开始使用RocketMQ来做支付业务处理, 便开启了学习阿里云RocketMQ的学习与实践之路, 其中踩了不少的坑, 大部份是由于没有仔细查看阿里云的技术文档而踩的坑. 但是有一个非常大 ...
- Spring Cloud 升级最新 Finchley 版本,踩了所有的坑!
Spring Boot 2.x 已经发布了很久,现在 Spring Cloud 也发布了 基于 Spring Boot 2.x 的 Finchley 版本,现在一起为项目做一次整体框架升级. 升级前 ...
- Redis上踩过的一些坑
来自: http://blog.csdn.net//chenleixing/article/details/50530419 上上周和同事(龙哥)参加了360组织的互联网技术训练营第三期,美团网的DB ...
随机推荐
- AutoCad 二次开发 .net 之相同块的自动编号
主要步骤: 一.获取一个块的id: 其中oId就是了. 二.通过次oId获取块引用blkRef: 三.通过它获取所有相同的块引用的id集合: 四.通过步骤三的集合得到所有的块引用得到集合listBr: ...
- 学习笔记62_python文件操作
#使用 str = raw_input("输入密码:") 来获取键盘的输入 #创建或打开一个文件 fp = open("hellow.txt","w& ...
- 关于virtualbox虚拟电脑控制台严重错误解决方法。。。
今天的我已经泪崩,忙了一天,临近下班的时候,突然发现虚拟机关了,再打开时,提示错误!!! 然后在网上查方法解决完的时候,再打开一看,完了,虚拟机里面的内容全没了...现将解决方法记录如下: 1.打开, ...
- JavaSE语法(中)
6.当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 是值传递.Java语言的方法调用支持参数的值传递.当一个对象实例作为一个 ...
- setAccessible()方法
在java代码中,我们经常使用private来控制类中成员变量的访问权限,在类的外边我们一般使用get方法获取私有成员变量的值,但是如果类中没有get方法,但我们又想获取该类私有成员变量的值,该怎么办 ...
- C/C++企业链表的实现
首先 先介绍企业链表 和Linux内核链表 和 之前我发的一篇单项链表的区别 结构体变量名是结构体的首地址吗? 这个问题会在待会链表实现中体现!! 答案:有些编译器 支持用结构体变量名做地址的方式但一 ...
- go xml 序列化
/** 序列化 */ package main import ( "encoding/xml" "fmt" ) // Person 结构 type Person ...
- python使用openpyxl操作excel总结
安装openpyxl pip install openpyxl 简单示例 from openpyxl import Workbook #创建一个工作薄对象,也就是创建一个excel文档 wb = Wo ...
- 生信 - 从repeatmasker传送门过来的 blast
以前有的是非完整时间写的博客,抽时间需要统一整理一下. 今天在重新装repeatmasker. 整个过程是这样的,有关联的事情有两个. 1. 装repeatmasker需要各种Prerequisite ...
- C++中对封装的语法支持——this指针
this指针 1.this概念 (1) This指针就是用于成员函数区分调用对象. (2) This指针由编译器自动传递,无须手动传递,函数内部隐藏了this指针参数,本类类型的指针. (3) 编译器 ...