PHP获取URL根域名完整类封装与使用示例
在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域名处理的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









