strpos和stripos的正确使用是什么? (这是一个错误吗?)

时间:2012-04-06 22:33:00

标签: php

这让我抛出一个循环:

$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

咦?好吧,我会尝试here

$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

我在看一个错误吗?

提前致谢。

编辑:

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

3 个答案:

答案 0 :(得分:4)

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

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

  

返回针相对于针的位置   开始使用haystack字符串(与offset无关)。另请注意   字符串位置从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);

答案 1 :(得分:1)

$mystring = 'abc';
$findme   = 'a';
$pos = strpos($mystring, $findme);

上面的例子运行正常。由于a位于0的{​​{1}}索引位置。如果它不在字符串中,则abc将返回strpos

答案 2 :(得分:1)

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

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