PHP问题:strpos函数无法正常工作

5
为什么以下PHP代码无法工作:
$string = "123";
$search = "123";

if(strpos($string,$search))
{
    echo "found";
}else{
    echo "not found";
}

由于$search在$string中 - 它不应该被触发为已找到吗?


请参考http://php.net/manual/en/function.strpos.php上的第一个示例。您需要使用===进行比较。 - AllisonC
为了避免这个问题,请学会使用 strstr - mario
7个回答

8
这在手册:strpos()中有提到。

此函数可能返回布尔值FALSE,但也可能返回一个非布尔值,该值为FALSE,例如0或“”。请阅读布尔值部分以获取更多信息。使用===运算符测试此函数的返回值。

在您的情况下,字符串位于索引0处,在php中0 == false

解决方案是只使用严格比较器。

echo strpos($string,$search) === false
     ? "not found"
     : "found";

另一个

echo is_int(strpos($string,$search))
     ? "found"
     : "not found";

或者说是什么有趣的东西:D 仅用于说明,我不建议使用这个。

echo strpos('_' . $string,$search) // we just shift the string 1 to the right
     ? "found"
     : "not found";

3

这是因为搜索字符串被发现在位置0。

尝试使用

if(strpos($string,$search) !== FALSE)

而不是

if(strpos($string,$search))


(1 != false) === true。实际上,对于每个 $x,都有 ($x != false) === ($x == true) === ((boolean) $x)。因此,这两个代码片段是相同的。 - KingCrunch
@KingCrunch:如果(strpos($string,$search) !== FALSE),那么这个正确吗? - Ozair Kafray
@OzairKafray 对我来说使用 !== false 是有效的,如果我使用 != false 就不行。 - user1301428
@user1301428:这是为了突出===/!==和==/!=之间的区别,在不同的情况下会有不同的作用。要确定使用什么,应仔细阅读函数文档,然后评估自己的情况。 - Ozair Kafray
1
如果我理解正确,当针头在干草堆的开头被找到时,应该始终使用!==,但我可能是错误的。 - user1301428
你说得对。我在想是什么让我得到了第一票。现在已经更新了。 - Ozair Kafray

2

strpos函数返回第一个找到的$search字符串的偏移量 - 0。而0会被转换为false,因此if条件不成立。

如果$search未被找到,strpos函数将返回FALSE。需要先检查返回值是否等于!== FALSE,然后再检查偏移量。

感谢所有在评论中指出这一点的人。

参见:http://php.net/manual/en/function.strpos.php


1
这就是为什么标准做法是检查 strpos(...) === FALSE。请参阅手册页面上的大警告:http://php.net/manual/en/function.strpos.php - grossvogel
1
正确的解释,但最好严格检查是否不为 false (!== false)。 - Evert
1
strpos($string,$search)>=0 的工作结果不如预期,因为 (false >= 0) === true - KingCrunch
当然,你是正确的 - 你真的应该检查 !== FALSE - Ryan

2

来自手册

该函数可能返回布尔值FALSE,但也可能返回一个非布尔值,该值会被解析为FALSE,例如0或""。请阅读关于布尔值的部分获取更多信息。使用===运算符测试该函数的返回值。

在您的示例中,应使用

$string = "123";
$search = "123";

if ( false !== strpos( $string, $search ) ) {
    echo "found";
} else {
    echo "not found";
}

1

如果找到了要搜索的字符串,strpos 将返回其数值位置。因此,在您的情况下,您应该这样做:

$search = "123";
$string = "123";
if (strpos($string,$search)===false) { echo "not found"; }
else { echo "found"; }

如果找不到您的字符串,它基本上会返回false。


0
你可以使用这个:
<?php

$string = "123";

$find = "123";

$strpos = strpos($string, $find);

if($strpos || $strpos === (int)0) {
    echo "Found it!";
} else {
    echo "Not Found!";
}

?>

0

这里详细说明了一个文档良好的问题。strpos只是返回'0'


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接