我正在使用以下功能,这给了我正确的输出,但它只检查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
在第三种情况下,它应该是无效的......
任何参考资料都将受到赞赏......
答案 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的实际上正确的语法。
但是你在这里走的是正确的道路,不要因过滤器检查的作用而气馁。这就是我验证域名的方法:
请注意,如果第二步失败,建议不要直接“失败”用户。有时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;
}