PHP获取URL根域名完整类封装与使用示例

雨后青山
雨后青山
发布时间:2026-10-15 | 4人浏览过
原创

在Web开发中,有时需要根据请求的URL提取其核心根域名(例如从 www.example.co.uk 提取 example.co.uk)。本文将展示一个基于PHP类的实现方案,该方案通过维护常见的顶级域名和国家代码列表,能够较为准确地识别根域名部分。

结果与目标

我们的目标是获得一个可复用的PHP类 Sl_RootDomain,它能够:

  • 接受一个完整的URL或主机名字符串。
  • 自动判断并分离出根域名(domain)和剩余的主机部分(host)。
  • 处理常见的多段后缀情况(如 .com.au, .co.uk)。

准备条件

该实现依赖于PHP内置的字符串处理和正则函数,无需安装额外扩展。主要逻辑基于两个硬编码数组:$state_domain(国家/地区代码)和 $top_domain(通用顶级域名),用于辅助判断域名层级。

真实操作顺序

第1步:引入或定义 Sl_RootDomain 类

目的:将域名解析逻辑封装为单例模式的类,以便在其他脚本中调用。该设计通过静态方法 instace()(注:原文拼写如此)返回实例,构造函数内初始化域名知识库。

<?php
class Sl_RootDomain{
    private static $self;
    private $domain=null;
    private $host=null;
    private $state_domain;
    private $top_domain;

    /**
     * 取得域名分析实例
     */
    public static function instace(){
        if(!self::$self)
            self::$self=new self();
        return self::$self;
    }

    private function __construct(){
        // 初始化国家代码列表(示例片段)
        $this->state_domain=array(
            'al','dz','af','ar','ae','aw','om','az','eg','et','ie','ee',
            // ... 此处省略大量国家代码,实际使用时需保留完整列表 ...,
            'cn','kr','jp','uk','us'
        );
        
        // 初始化顶级域名列表
        $this->top_domain=array(
            'com','arpa','edu','gov','int','mil','net','org',
            'biz','info','pro','name','museum','coop','aero','xxx'
        );
        
        // 默认获取当前HTTP_HOST
        $this->url=$_SERVER['HTTP_HOST'];
    }

    /**
     * 设置URL进行解析
     * @param string $url
     */
    public function setUrl($url=null){
        $url=$url?$url:$this->url;
        if(empty($url))return $this;
        
        // 确保协议头存在以便parse_url工作
        if(!preg_match("/^http::/is", $url))
            $url="http://".$url;
            
        $url=parse_url(strtolower($url));
        $urlarr=explode(".", $url['host']);
        $count=count($urlarr);
        
        if ($count<=2){
            $this->domain=array_pop($url);
            $this->host='';
        } else if ($count>2){
            $last=array_pop($urlarr);
            $last_1=array_pop($urlarr);
            
            if(in_array($last, $this->top_domain)){
                $this->domain=$last_1.'.'.$last;
                $this->host=implode('.', $urlarr);
            } else if (in_array($last, $this->state_domain)){
                $last_2=array_pop($urlarr);
                if(in_array($last_1, $this->top_domain)){
                    $this->domain=$last_2.'.'.$last_1.'.'.$last;
                    $this->host=implode('.', $urlarr);
                } else {
                    $this->host=implode('.', $urlarr).$last_2;
                    $this->domain=$last_1.'.'.$last;
                }
            }
        }
        return $this;
    }

    /**
     * 取得根域名
     */
    public function getDomain(){
        return $this->domain;
    }

    /**
     * 取得主机前缀
     */
    public function getHost(){
        return $this->host;
    }
}
?>

注意:原文中的 instance 拼写为 instace,且 preg_match 正则 /^http::/is 可能存在笔误(通常应为 /^http:.*$/ 或类似匹配协议的表达式),但在本封装中若传入的是标准URL,parse_url 也能处理无协议头的情况。建议在正式项目中修正正则或依赖 parse_url 的鲁棒性。

第2步:实例化并设置URL

目的:通过类提供的静态方法获取实例,并传入目标URL字符串进行解析。

<?php
// 获取单例
$parser = Sl_RootDomain::instace();

// 设定待分析的URL
$url_to_parse = "sub.domain.example.co.uk";
$parser->setUrl($url_to_parse);

// 或者不传参数,直接使用当前服务器的 HTTP_HOST
// $parser->setUrl(); 
?>

第3步:提取并验证结果

目的:调用 getter 方法获取分解后的域名和主机信息。

<?php
$root_domain = $parser->getDomain();   // 预期输出: example.co.uk
$host_prefix = $parser->getHost();     // 预期输出: sub.domain

echo "Root Domain: " . $root_domain;
echo "\nHost Prefix: " . $host_prefix;
?>

完成判断

执行上述代码后,变量 $root_domain 应包含核心的注册域名,而 $host_prefix 包含剩余的子域名层级。若域名结构简单(如 a.com),则 $host 将为空或null,$domain 为 a.com。

简要总结

以上是通过PHP自定义类 Sl_RootDomain 提取URL根域名的详细内容。该方法适用于需要简单解析域名结构且在轻量级环境下运行的PHP项目,更多关于PHP域名处理的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表