2012-04-20 18 views
0

私はこれが私の右出力を与えるだけで、それはチェックし、次の関数を使用しています両方がチェックが有効なURLと有効なドメイン名

filter_var($url, FILTER_VALIDATE_URL) 

... URLパターンではない正しいドメイン名でありますそれは私が正しいドメイン名はまだそれが有効なURLが表示されている、正しいURLを入力してくださいではなく、よ場合には有効ですが、表示される正しいURL ...それが無効であるべき第三の場合

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

    http://www.google 
    output: Invalid 

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

...

は、任意の参照がいただければ幸いです...

+1

filter_varはDNSリクエストが必要なドメインの実際の存在ではなく構文をチェックするだけです。 TLDの有効なリストは簡単に見つけることができますが、それを完全に検証したい場合(サブドメインとすべて)には、DNS対応のものを使用する必要があります。 – Corbin

+3

「google.aa」は無効なドメイン名である必要はありません。また、「www.google」もありません。それらは技術的に有効であり、存在する可能性もあります。彼らがいるかどうかを知るためには、DNSシステムを通してそれらを調べる必要があります。 – deceze

答えて

2

技術的にこれを試してみてください第二の例も「有効」とみなされるべきであると私は、フィルタが正しいとしてそれを検証しないことを驚いています。 3番目の例も正しいです。この方法では構文のみがチェックされ、3つの例すべてがという実際にはURLの構文が正しくになります。

ここでは正しい方向に向いていますが、フィルタのチェックでは落胆しないでください。これは私がドメイン検証するために何をすべきかです:()にfilter_var($のURL、FILTER_VALIDATE_URLここで適切である)

  • 妥当性をチェック構文のをドメインDNS(PHPの関数のgethostbyname()とdns_get_recordの
  • チェック有無()の両方助けてください)

2番目の手順が失敗した場合にユーザーを完全に「失敗」しないことをお勧めします。場合によっては、DNSやサーバーに問題があり、正しいとはいえ、要求が失敗することがあります(facebook.comでも失敗することがあります)。結果として、あなたはURLを '許可する'べきですが、後でもう一度ダブルチェックするまで、何もしないでください。したがって、複数のチェックに失敗した場合は、プロセスをキャンセルする必要があります。

+0

私はそれを持って、ありがとう。 –

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); 
} 
+0

つまり、URLのリクエストを試してみてください。はい、これはおそらくOPが望んでいるものですが、ドメイン名が必ずしもその背後にHTTPサーバがあることを意味するわけではないので、ドメイン名*を検証する場合は良い選択肢ではありません。 – deceze

+0

はい、あなたは正しいですが、要件ごとにチェックする必要があります。 –

+0

サマンサマント、私の場合、それは働いています.... –

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; 

} 
関連する問題