[TOC]
##域名操作工具类
~~~
class domainTool
{
static $suffix = array(
'org.cn', 'gov.cn', 'com.cn', 'net.cn'
);
/**
* 获取域名后缀
* @param string $url 域名地址
* http://www.domain.com.cn 返回 com.cn
* @return string
*/
static function getSuffix($url)
{
$parseUrl = parse_url($url);
$domain = isset($parseUrl['host']) ? $parseUrl['host'] : $parseUrl['path'];
//通过 . 分隔域名
$pieces = explode(".", $domain);
if(empty($pieces)){
return '';
}
//域名后缀下标
$index = count($pieces) - 1;
//尝试获取com.cn, net.cn等后缀
$prevIndex = $index - 1;
$suffix = $pieces[$prevIndex] . '.' . $pieces[$index];
//如果为com.cn, net.cn等后缀,直接返回
if (in_array($suffix, self::$suffix)) {
return $suffix;
} else {
return $pieces[$index]; //直接返回域名后缀下标
}
}
/**
* 获取根域名
* @example
* http://aaa.bbb.ccc.domain.net.cn:9000/xxx/yyy?zzz=1 默认返回 domain.net.cn:9000
* @param string $url 域名地址
* @param string $subDomain 返回的二级域名
* @param bool $needPort 是否带上端口号
* @return string
*/
static function getRoot($url = '', $subDomain = '', $needPort = true)
{
if (empty($url)) {
$url = isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : $_SERVER['HTTP_HOST'];
}
//解析域名地址
$parseUrl = parse_url($url);
if (!isset($parseUrl['host']) || empty($url)) {
return '';
} else {
$domain = $parseUrl['host'];
}
//如果为ip,则直接返回
if (preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/', $domain)){
return $domain;
}
//判断是否为com.cn、net.cn等域名后缀
$suffix = self::getSuffix($domain);
$pieces = explode('.', $domain);
if (strpos($suffix, '.') !== false) {
$index = count($pieces) - 3;
} else {
$index = count($pieces) - 2;
}
$name = $pieces[$index];
$rootDomain = ($subDomain ? $subDomain . '.' : '') . $name . '.' . $suffix;
return $rootDomain . ($needPort && isset($parseUrl['port']) ? ':' . $parseUrl['port'] : '');
}
}
~~~
##示例
~~~
$url = 'http://aaa.bbb.ccc.domain.net.cn:9000/xxx/yyy?zzz=1';
/*
* ------- 获取域名后缀示例
*/
//输出net.cn
echo domainTool::getSuffix($url);
/*
* ------- 获取根域名示例
*/
//输出domain.net.cn:9000
echo domainTool::getRoot($url);
//输出sub.domain.net.cn:9000
echo domainTool::getRoot($url,'sub');
//输出www.domain.net.cn
echo domainTool::getRoot($url,'www',false);
~~~