web-dev-qa-db-ja.com

単純なPHP strpos関数が機能しない、なぜですか?

このスタンドアロンコードが機能しないのはなぜですか。

$link = 'https://google.com';
$unacceptables = array('https:','.doc','.pdf', '.jpg', '.jpeg', '.gif', '.bmp', '.png');

foreach ($unacceptables as $unacceptable) {
        if (strpos($link, $unacceptable) === true) {
            echo 'Unacceptable Found<br />';
        } else {
            echo 'Acceptable!<br />';
        }
}

Httpsが$link変数に含まれている場合でも、毎回許容される印刷です。

22
Daniel

疑わしいときは the docs を読んでください:

[strpos] haystack文字列で最初に見つかったneedleの数値位置を返します。

だからあなたはもっともっと何かを試してみたい:

// ...
if (strpos($link, $unacceptable) !== false) {

それ以外の場合、strposは数値を返し、ブール値trueを探しているためです。

64
coreyward

strpos() は、一致を検出してもtrueを返さず、最初に一致した文字列の位置を返します。注意:一致が文字列の先頭である場合、===演算子を使用しない限りfalseと比較されるゼロのインデックスを返します。

10
acrosman

あなたの失敗状態は間違っています。

一致が見つからない場合、strposはfalseを返すため、明示的に確認する必要があります。

if (strpos($link, $unacceptable) !== false) {
6
Foo Bah

Strposは常に文字列( 'https://google.com';)で「httpsL」を検索するように位置を返し、次に0番目の位置を返し、PHPはfalseと評価します。

このリンクを参照してください:(あなたにとって非常に便利であることを願ってください): http://php.net/manual/en/function.strpos.php

1
Manish Trivedi

strpos

関数はブールFALSEを返す場合がありますが、FALSEと評価される非ブール値を返す場合もあります。

だから私はこのようにしました

if (strpos($link, $unacceptable) !== false) {
    //Code
}
0
Aniket B