什么是正确使用strpos和/或条带?(这是一个错误吗?


What is the proper use of strpos and or stripos? (Is this a bug?)

这让我陷入了循环:

$s = "ERROR: 5 - [RecordN...blah blah blah";
print stripos($s, 'error') . "'n";
print strpos($s, "ERROR") . "'n";
print $s . "'n";

结果在:

0
0
ERROR: 5 - [RecordN...blah blah blah

哼?好的,我会从这里尝试一些东西:

$mystring = 'abc';
$findme   = 'a';
$pos = strpos($mystring, $findme);
print $pos . "'n";

结果是:

0

什么?

我正在运行:

php --version
PHP 5.3.6-13ubuntu3.6 with Suhosin-Patch (cli) (built: Feb 11 2012 03:26:01) 
Copyright (c) 1997-2011 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies

我在看错误吗?

提前谢谢。

编辑:

显然在那里失去了理智。 感谢您的所有回复。

一切都是正确的。你得到零是因为第一次 stripos 返回 0 作为"e"(或"E")的位置,而在第二次情况下,零只是 FALSE 打印为整数。

如果您检查 stripos 的手册,您将看到返回值描述为

返回指针相对于 干草堆字符串的开始(与偏移量无关)。另请注意 该字符串位置从 0 开始,而不是 1。

尝试将代码更改为此代码,您将明白我的意思:

$s = "ERROR: 5 - [RecordN...blah blah blah";
var_dump(stripos($s, 'error'));
var_dump(strpos($s, "ERROR"));
var_dump(strpos($s, 'error'));
var_dump(stripos($s, "ERROR"));
print $s . "'n";
#

1、#2 和 #4 将为 int(0),#3 将为 bool(false)。

在你的第二个例子中也发生了完全相同的事情。您正在检查"a"的位置,它实际上是字符串中的第一个字符,这意味着它的位置为 0。

如果您需要检查字符串是否是错误,您应该将代码从(据说)更改为:

$s = "ERROR: 5 - [RecordN...blah blah blah";
$isError = stripos($s, 'error') != 0;

对此:

$s = "ERROR: 5 - [RecordN...blah blah blah";
$isError = (stripos($s, 'error') !== false);

或者根据需要使其区分大小写:

$s = "ERROR: 5 - [RecordN...blah blah blah";
$isError = (strpos($s, 'ERROR') !== false);
$mystring = 'abc';
$findme   = 'a';
$pos = strpos($mystring, $findme);

上面的示例工作正常。由于a处于abc0指数位置。如果它不在字符串中,那么strpos将返回false

如果搜索词位于字符串的位置 0(即开头),则返回零。明显地。

如果搜索词不在字符串中,则返回FALSE。这就是为什么你应该使用 !== FALSE 来测试是否已找到字符串。

相关文章: