0

これは私にループを投げさせました:

$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

私はバグを見ていますか?

前もって感謝します。

編集:

明らかにそこで私の感覚を失いました。すべての回答をありがとう。

4

3 に答える 3

4

すべてが正しいです。最初の場合、striposは「e」(または「E」)の位置として0を返すのに対し、2番目の場合、ゼロは単にFALSEであり、整数として出力されるため、ゼロを取得しています。

マニュアルでstriposを確認すると、戻り値の説明が次のようになっていることがわかります。

干し草の山の文字列の先頭を基準にして針が存在する位置を返します(オフセットとは関係ありません)。また、文字列の位置は1ではなく0から始まることに注意してください。

コードをこれに変更してみてください。そうすれば、私が何を意味するのかがわかります。

$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)になります。

2番目の例でもまったく同じことが起こっています。「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);
于 2012-04-06T22:50:44.207 に答える
1
$mystring = 'abc';
$findme   = 'a';
$pos = strpos($mystring, $findme);

上記の例は正常に機能します。a0インデックス位置にあるのでabc。文字列に含まれていない場合は、 strposを返しfalseます。

于 2012-04-06T22:35:57.240 に答える
1

検索語が文字列の位置0にある場合(つまり、先頭にある場合)、ゼロを返します。明らかに。

検索語が文字列に含まれていない場合は、FALSEが返されます。これが!== FALSE、文字列が見つかったかどうかをテストするために使用する必要がある理由です。

于 2012-04-06T22:36:08.630 に答える