检查有效的URL和有效的域名

时间:2012-04-20 05:24:04

标签: php

我正在使用以下功能,这给了我正确的输出,但它只检查URL模式不正确域名...

    filter_var($url, FILTER_VALIDATE_URL)

如果我输入正确的网址,则显示该网址有效,但如果我输入的网址不正确但域名仍然不正确,则会显示有效网址。

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

    http://www.google
    output: Invalid

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

在第三种情况下,它应该是无效的......

任何参考资料都将受到赞赏......

3 个答案:

答案 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);
}

答案 1 :(得分:2)

从技术上讲,第二个例子也应该被认为是“有效的”,我很惊讶过滤器没有将其验证为正确。第三个例子也是正确的。该方法仅检查语法,并且所有三个示例都是URL的实际上正确的语法。

但是你在这里走的是正确的道路,不要因过滤器检查的作用而气馁。这就是我验证域名的方法:

  • 检查语法的有效性(filter_var($ url,FILTER_VALIDATE_URL)在这里是合适的)
  • 检查域DNS是否存在(PHP函数gethostbyname()和dns_get_record()都有帮助)

请注意,如果第二步失败,建议不要直接“失败”用户。有时DNS或服务器存在问题,尽管是正确的,但请求可能会失败(甚至facebook.com有时会失败)。因此,您应该“允许”该URL,但在以后再次对其进行双重检查之前,不要对其执行任何操作。因此,如果多次检查失败,那么您应该取消该过程。

答案 2 :(得分: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;

}