我写了这段代码:
$token="Birth";
$msg="I am awesome and I know it";
if(strpos(strtolower($msg),strtolower($token)) >=0){
echo 'ok';
}
打印ok
我们可以看到消息中没有Birth
之类的字词,但仍会返回true
。我想它应该返回false
,因为php手册说。
这方面的任何帮助,
答案 0 :(得分:8)
strpos()
返回FALSE
,如果找到令牌,则返回令牌的(第一个)位置。您需要使用严格比较运算符FALSE
检查布尔值===
,以确定是否在字符串中找到了令牌:
if(strpos(strtolower($msg),strtolower($token)) !== false){
echo 'ok';
} else {
echo 'not ok';
}
这是因为PHP的松散打字系统。如果您使用>=0
,但未找到令牌,则PHP会在FALSE
操作之前将strpos
返回值0
转换为>=
。 0 >=0
评估为TRUE
。
答案 1 :(得分:2)
strpos()
将返回false。通过检查结果是否大于或等于零,将false转换为变为零的整数。所以零等于零,使你的if语句成立。
要解决此问题,只需查看strpos()
是否返回false:
if(strpos(strtolower($msg),strtolower($token)) !== false)
答案 2 :(得分:1)
这是因为php自动播放。您还需要使用三重比较检查类型。
这样做:
$token="Birth";
$msg="I am awesome and I know it";
if(strpos(strtolower($msg),strtolower($token)) !== false)
echo 'ok';
答案 3 :(得分:1)
小心strpos:
如果提供的变量中存在相应的字符串,则 strpos返回position (number)
,如果它根本不存在,则返回boolean FALSE
。因此,如果你说if(strpos(...)>=0)
,它总是会评估为真,因为即使是boolean FALSE evaluates to 0
。实现此功能的最佳方法是使用hard compare
。只是说
if(strpos(strtolower($msg),strtolower($token)) !== FALSE){
// The above line will tell PHP that treat the condition as passed
// only when strpos does not return The boolean FALSE.
echo 'ok';
}