看到你,梁松远的博客

位置 » 主页 » 代码分享 » php方法从当前域名中,获取顶级域名

php方法从当前域名中,获取顶级域名

 // 从当前域名中,获取顶级域名

function getTopDomain($domain) {
// 能支持到的单域
if ( preg_match('/.seowhy$/i',$domain) ) {
return 'seowhy';
}
$domainRoots = array('ac', 'aero', 'ag', 'al', 'at', 'au', 'as', 'be', 'bg', 'biz',
'br', 'ca', 'cc', 'cd', 'ch', 'ck', 'cl', 'cn', 'co','com', 'cx',
'cz', 'de', 'dk', 'ee', 'edu', 'eg', 'es', 'fi', 'fj', 'fo',
'fr', 'ge', 'gl', 'gr', 'gs', 'gs', 'hm', 'hk', 'hu', 'ie',
'info', 'it', 'int', 'is', 'il', 'jp', 'kr', 'la', 'li', 'lk',
'lt', 'lu', 'lv', 'mc', 'mil', 'mn', 'ms', 'mx', 'name', 'net',
'nl', 'no', 'nz', 'org', 'pl', 'pt', 'ro', 'ru', 'se', 'sg',
'sh', 'si', 'sk', 'sm', 'st', 'tc', 'th', 'to', 'tr', 'tv',
'tw', 'uk', 'va', 'vg', 'ws', 'my', 'me', 'us', 'asia', 'vc',
'pro', 'museum', 'coop', 'idv', 'bz', 'in', 'cm', 'mobi','top','tel','so','wang');
 
// 能支持的双域
$doubleDomainRoots = array('ac.cn', 'ac.jp', 'ac.uk', 'ad.jp', 'adm.br', 'adv.br', 'agr.br', 'ah.cn', 'am.br', 'arq.br',
'art.br', 'asn.au', 'ato.br', 'bio.br', 'bj.cn', 'bmd.br', 'cim.br', 'cng.br', 'cnt.br', 'com.au',
'com.br', 'com.cn', 'com.eg', 'com.hk', 'com.mx', 'com.ru', 'com.tw', 'conf.au', 'co.jp', 'co.uk',
'cq.cn', 'csiro.au', 'ecn.br', 'edu.au', 'edu.br', 'esp.br', 'etc.br', 'eti.br', 'eun.eg', 'emu.id.au',
'eng.br', 'far.br', 'fj.cn', 'fm.br', 'fnd.br', 'fot.br', 'fst.br', 'g12.br', 'gd.cn', 'ggf.br',
'gr.jp', 'gs.cn', 'gov.au', 'gov.br', 'gov.cn', 'gov.hk', 'gob.mx', 'gz.cn', 'gx.cn', 'he.cn',
'ha.cn', 'hb.cn', 'hi.cn', 'hl.cn', 'hn.cn', 'hk.cn', 'id.au', 'ind.br', 'imb.br', 'inf.br',
'info.au', 'idv.tw', 'jl.cn', 'jor.br', 'js.cn', 'jx.cn', 'lel.br', 'ln.cn', 'ltd.uk', 'mat.br',
'med.br', 'mil.br', 'mo.cn', 'mus.br', 'ne.jp', 'net.au', 'net.br', 'net.cn', 'net.eg', 'net.hk',
'net.lu', 'net.mx', 'net.uk', 'net.ru', 'net.tw', 'nm.cn', 'nom.br', 'not.br', 'ntr.br', 'nx.cn',
'plc.uk', 'odo.br', 'oop.br', 'or.jp', 'org.au', 'org.br', 'org.cn', 'org.hk', 'org.lu', 'org.ru',
'org.tw', 'org.uk', 'pp.ru', 'ppg.br', 'pro.br', 'psi.br', 'psc.br', 'qh.cn', 'qsl.br', 'rec.br',
'sc.cn', 'sd.cn', 'sh.cn', 'slg.br', 'sn.cn', 'srv.br', 'sx.cn', 'tj.cn', 'tmp.br', 'trd.br',
'tur.br', 'tv.br', 'tw.cn', 'vet.br', 'wattle.id.au', 'xj.cn', 'xz.cn', 'yn.cn', 'zlg.br', 'zj.cn');
 
// 用点切开域名
$domain = strtolower(trim($domain));
if ( !strpos($domain,'.') ) {
//不存在“点”或“点”在第一位。
return false;
}
 
$domains = explode('.', $domain);
$count = count($domains);
$dotNum = $count - 1;
 
if (!$dotNum) {
// 域名中没有点,说明域名错误
return false;
} elseif($dotNum == 1) {
// 只有一个点,说明域名就是主域
return $domain;
}
if(in_array($domains[$dotNum-1] . '.' . $domains[$dotNum], $doubleDomainRoots)) {
// 后两个在双域列表,说明后三个就是顶级域名
return (string) $domains[$dotNum-2] . '.' . $domains[$dotNum-1] . '.' . $domains[$dotNum];
} elseif(in_array($domains[$dotNum], $domainRoots)) {
// 最后一个在单域列表,说明最后两个是顶级域名
return (string) $domains[$dotNum-1] . '.' . $domains[$dotNum];
} else {
// 不在允许列表
return false;
}
}