PHP中strpos()检测字符串星号失效?已尝试多函数仍无效果
问题根源:PHP弱类型比较的陷阱
哦,这个问题我太熟悉了——你不小心踩了PHP弱类型比较的坑!
为什么strpos()看起来“失效”了?
先理清楚strpos()的返回规则:
- 如果找到目标字符/字符串,返回它在原字符串中的索引位置(PHP里字符串索引从0开始计数)
- 如果没找到,返回布尔值
false
你的字符串是"****123",星号在最开头,所以strpos($str, '*')会返回0。但你用了== false做判断,PHP的弱类型比较会把0自动转换成布尔值false,导致条件错误成立,最终输出了“没有星号”的错误结果。
至于你尝试的stripos()、mb_strpos()这些函数,它们的返回规则和strpos()完全一致,所以也会遇到同样的问题。
修复方案:用严格比较符===
把判断条件改成严格等于(===)或者严格不等于(!==),这样PHP就不会做自动类型转换,能准确区分0(找到的位置)和false(未找到):
方案1:判断不存在时用=== false
$str = "****123"; if(strpos($str, '*') === false){ echo 'There is no asterisk in the string'; } else { echo 'There is asterisk in the string'; }
方案2:判断存在时用!== false(更符合直觉)
$str = "****123"; if(strpos($str, '*') !== false){ echo 'There is asterisk in the string'; } else { echo 'There is no asterisk in the string'; }
这两种写法都能正确识别字符串开头的星号,输出你期望的结果。
内容的提问来源于stack exchange,提问作者Arslan Developer
相关产品推荐
相关产品推荐

