5

次のphpコードが機能しないのはなぜですか:

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

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

$search は $string にあるため、見つかったときにトリガーされるべきではありませんか?

4

7 に答える 7

7

これはマニュアルに記載されています: strpos()

この関数は、ブール値の FALSE を返す場合がありますが、0 や "" など、FALSE と評価されるブール値以外の値を返す場合もあります。詳細については、ブール値のセクションを参照してください。この関数の戻り値をテストするには、=== 演算子を使用します。

あなたの場合、文字列はインデックス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";
于 2011-05-23T15:25:25.740 に答える
3

これは、検索文字列が位置 0 で見つかっているために発生しています。

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

それ以外の

if(strpos($string,$search))

于 2011-05-23T15:26:30.260 に答える
2

strpos見つかった最初のオフセットを返します$search- 00に評価されfalseます。したがって、if は失敗します。

$searchが見つからなかった場合は、 をstrpos返しますFALSE。最初に の戻り値を!== FALSE確認し、次にオフセットを確認します。

コメントでこれを指摘してくれたすべての人に感謝します。

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

于 2011-05-23T15:24:43.337 に答える
2

マニュアルから:

この関数は、ブール値の FALSE を返す場合がありますが、0 や "" など、FALSE と評価されるブール値以外の値を返す場合もあります。詳細については、ブール値のセクションを参照してください。 この関数の戻り値をテストするには、=== 演算子を使用します。

あなたの例では、使用する必要があります

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

if ( false !== strpos( $string, $search ) ) {
    echo "found";
} else {
    echo "not found";
}
于 2011-05-23T15:26:43.443 に答える
1

strpos は、検索する文字列が見つかった場合、その文字列の数値位置を返します。したがって、あなたの場合、代わりにこれを実行したいと考えています:

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

基本的に、文字列が見つからない場合は false を返します

于 2011-05-23T15:28:02.967 に答える
0

これを使用できます:

<?php

$string = "123";

$find = "123";

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

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

?>
于 2011-05-23T15:25:45.197 に答える
0

十分に文書化された問題がここで説明されています。strpos は単に「0」を返しています

于 2011-05-23T15:26:08.597 に答える