前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如果让 strpos 查找一个整数类型的数字会发生什么?

如果让 strpos 查找一个整数类型的数字会发生什么?

作者头像
写PHP的老王
发布2019-08-12 15:32:59
7430
发布2019-08-12 15:32:59
举报
文章被收录于专栏:写PHP的老王写PHP的老王

每次数据来了,想要查找这个字符串中某个字符,上来就是使用strpos。strpos用于查找字符串中某个子串第一次出现的位置。

那么,如果不小心给strpos传入的是一个整数类型又会怎么样呢?

假设有一个字符串"I don't happy ! xxxx585xxx",现在需要把585以及后面的全部去掉。585是文件,或者数据库读取出来的,且做了数字类型格式化。

直接使用strpop($str,$find);获取字符串的起始位置,然后再使用substr做一个截取。看似没有错误,但实际上跑完之后却是把整个字符串都删掉了。上面得到的是一个空字符串

查看php 源码中string.c的文件,找到strpos的代码。strpos对于非字符串类型的数据使用php_needle_char做了一次类型转换,强制类型转换。

从 C 代码中可以看到,如果是整数类型,则强制转换成char类型。所以当你传入585的时候,使用char进行强转之后得到的结果是字符串"I",所以实际上截取之后的字符串长度为0。

类型转换分为下列几种情况:

1、整形,长整型直接转成char类型

2、布尔值,分别转成字符'1','0',所以strpost('e1',true);返回内容为1

3、double类型数据,先强转为长整型再转换成char类型

4、对象则对对象id进行char的转换

5、其他类型触发E_WARNING的警告到这里就了解了为什么给一个整数,strpos会有意向不到的结果。

strpos里的代码还是比较简单,读起来也不费劲。

对offset参数进行验证,在这一步过滤越界的offset。同时对负数的offset进行处理,转换成正数,在下面的处理统一安正数处理

处理分为字符和非字符两种方式进行处理。非字符类型进行一次数据类型转换,最终根据查找字符的长度在原始字符串中搜索位置。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-01-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 写PHP的老王 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档