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);

 

posted on 2016-05-13 20:21  老松壳  阅读(308)  评论(0)    收藏  举报