准确提取域名可能非常棘手,主要是因为域扩展可以包含两个部分(如.com.au或.co.uk),而子域(前缀)可能存在,也可能不存在。列出所有的域扩展不是一个选项,因为其中有数百个。例如,EuroDNS.com列出了800多个域名扩展。
因此,我编写了一个简短的php函数,它使用‘parseurl()’和一些有关域扩展的观察来准确提取url组件和域名。职能如下:function parse_url_all($url){
$url = substr($url,0,4)=='http'? $url: 'http://'.$url;
$d = parse_url($url);
$tmp = explode('.',$d['host']);
$n = count($tmp);
if ($n>=2){
if ($n==4 || ($n==3 && strlen($tmp[($n-2)])<=3)){
$d['domain'] = $tmp[($n-3)].".".$tmp[($n-2)].".".$tmp[($n-1)];
$d['domainX'] = $tmp[($n-3)];
} else {
$d['domain'] = $tmp[($n-2)].".".$tmp[($n-1)];
$d['domainX'] = $tmp[($n-2)];
}
}
return $d;}
这个简单的函数几乎在每一种情况下都能工作。有几个例外,但这些是非常罕见的。
要演示/测试此函数,可以使用以下方法:$urls = array('www.test.com', 'test.com', 'cp.test.com' .....);echo "
URL | Host | Domain | Domain X |
---|
$info = parse_url_all($url);
echo "
".$url."".$info['host']."
".$info['domain']."".$info['domainX']."";}echo "对于URL列出的输出如下:
如您所见,无论呈现给函数的URL是什么,都会一致提取没有扩展名的域名和域名。
我希望这能帮上忙。