0

私は次の関数を使用しています。これにより正しい出力が得られますが、URLパターンが正しくないことを確認するだけですドメイン名...

    filter_var($url, FILTER_VALIDATE_URL)

正しい URL を入力すると有効であると表示されますが、正しい URL を入力してもドメイン名が正しくない場合でも、有効な URL が表示されます。

Ex.
    http://www.google.co.in
    Output: Valid

    http://www.google
    output: Invalid

    http://www.google.aa
    output: Valid

3 番目のケースでは、無効である必要があります...

参考になれば幸いです...

4

3 に答える 3

2

これを試してみてください

function url_exist($url){//se passar a URL existe
    $c=curl_init();
    curl_setopt($c,CURLOPT_URL,$url);
    curl_setopt($c,CURLOPT_HEADER,1);//get the header
    curl_setopt($c,CURLOPT_NOBODY,1);//and *only* get the header
    curl_setopt($c,CURLOPT_RETURNTRANSFER,1);//get the response as a string from curl_exec(), rather than echoing it
    curl_setopt($c,CURLOPT_FRESH_CONNECT,1);//don't use a cached version of the url
    if(!curl_exec($c)){
        //echo $url.' inexists';
        return false;
    }else{
        //echo $url.' exists';
        return true;
    }
    //$httpcode=curl_getinfo($c,CURLINFO_HTTP_CODE);
    //return ($httpcode<400);
}
于 2012-04-20T05:38:54.363 に答える
2

技術的には、2 番目の例も「有効」と見なす必要がありますが、フィルターが正しいと検証しないことに驚いています。3 番目の例も正しいです。このメソッドは構文のみをチェックします。3 つの例はすべて、実際には URL の正しい構文です。

しかし、あなたはここで正しい道を進んでいます。フィルター チェックの機能に落胆しないでください。これは私がドメインを検証するために行うことです:

  • 構文の有効性を確認します (ここでは filter_var($url,FILTER_VALIDATE_URL) が適切です)
  • ドメイン DNS の存在を確認します (PHP 関数 gethostbyname() と dns_get_record() の両方がここで役立ちます)。

2 番目のステップが失敗した場合、ユーザーを完全に「失敗」させないことをお勧めします。DNS またはサーバーに問題があり、要求が正しいにもかかわらず失敗することがあります (facebook.com でさえ失敗する場合があります)。その結果、URL を「許可」する必要がありますが、後で再確認するまで何もしないでください。したがって、複数のチェックが失敗した場合は、プロセスをキャンセルする必要があります。

于 2012-04-20T06:20:46.240 に答える
0

これがうまくいくことを願っています!

/**
 * checks if a domain name is valid
 * @param  string $domain_name 
 * @return bool              
 */
public function validate_domain_name($domain_name)
{
    //FILTER_VALIDATE_URL checks length but..why not? so we dont move forward with more expensive operations
    $domain_len = strlen($domain_name);
    if ($domain_len < 3 OR $domain_len > 253)
        return FALSE;

    //getting rid of HTTP/S just in case was passed.
    if(stripos($domain_name, 'http://') === 0)
        $domain_name = substr($domain_name, 7); 
    elseif(stripos($domain_name, 'https://') === 0)
        $domain_name = substr($domain_name, 8);

    //we dont need the www either                 
    if(stripos($domain_name, 'www.') === 0)
        $domain_name = substr($domain_name, 4); 

    //Checking for a '.' at least, not in the beginning nor end, since http://.abcd. is reported valid
    if(strpos($domain_name, '.') === FALSE OR $domain_name[strlen($domain_name)-1]=='.' OR $domain_name[0]=='.')
        return FALSE;

    //now we use the FILTER_VALIDATE_URL, concatenating http so we can use it, and return BOOL
    return (filter_var ('http://' . $domain_name, FILTER_VALIDATE_URL)===FALSE)? FALSE:TRUE;

}
于 2014-10-20T19:00:04.707 に答える