1

ここにこの小さなスニペットがあり、ステートメントをfalse満たしていても返されます。if

$urls = $_POST['links'];
    trim($urls);
$urls = explode("\r\n",$urls);
foreach($urls as $url){
    trim($url);
    if(strpos($url,'http://') === false)
        $url = 'http://'.$url;
    $parse = parse_url($url, PHP_URL_HOST);
    if(($parse != 'site.com') || ($parse != 'www.site.com')) //problem here
        echo 'false:'.$parse.'<br>';
    else
        echo 'true:'.$parse;
}

入力はテキストエリアからのものです:

http://site.com
site.com
http://www.site.com
www.site.com

出力:

true:site.com
true:site.com
false:www.site.com
false:www.site.com

何が問題だと思いますか?

4

4 に答える 4

4

あなたが本当に何を意図していたのかわかりませんが、次の行は間違いなく間違っています:

    if(($parse != 'site.com') || ($parse != 'www.site.com')) //problem here

これは常にtrueを返します。これは、解析が「site.com」でない場合はtrueですが、解析が「www.site.com」でない場合もtrueであり、同時に両方にすることはできないため、常に真実である。||の代わりに&&を意味しましたか?つまり、論理ORではなく論理AND?

if(($parse != 'site.com') && ($parse != 'www.site.com')) 

編集:実際、質問に入力した内容が望ましい動作である場合、つまり、site.comの場合はtrue、www.site.comの場合はfalseの場合は、次のようにします。

if ($parse == 'site.com')
{
    echo 'false:'.$parse;
}
else if ($parse == 'www.site.com')
{
    echo 'false:'.$parse;
}

または多分それは本当にあなたが望むものではありません...

于 2012-05-02T09:15:25.237 に答える
1

2番目のifステートメントで使用したロジックについて考えてみてください。何があっても、あなたは常にブランチ$parseに陥ります。(つまり、ブランチifに陥ることはありません。)else

次の代替案を検討してください。

// "Not A AND Not B"
if(($parse != 'site.com') && ($parse != 'www.site.com'))
// ...

// "Neither A nor B"
if(!(($parse == 'site.com') || ($parse == 'www.site.com')))
// ...

// "Either A or B"
if(($parse == 'site.com') || ($parse == 'www.site.com'))
    echo 'true:'.$parse;
else
    echo 'false:'.$parse.'<br>';
// Note here we also swapped the two branches.
于 2012-05-02T09:15:53.380 に答える
0

この行を置き換えます:

if(($parse != 'site.com') && ($parse != 'www.site.com'))
于 2012-05-02T09:24:15.307 に答える
0

if 行を次のように変更します。

if(($parse != 'site.com') && ($parse != 'www.site.com'))
于 2012-05-02T09:16:19.850 に答える