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

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

任何参考将不胜感激...

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

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

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

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

请注意,如果第二步失败,建议不要直接“失败”用户。有时 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 回答