最近在做某个项目时,收到一个需求是用 PHP 解析出链接中的顶级域名。众所周知,如果只需要解析出链接中的域名部分,使用 PHP 自带的 parse_url 函数即可做到:
<?php
$url = 'http://mazzz.cc/markdown/';
echo parse_url($url)['host'];
如果需要进一步从中间提取出顶级域名,那么只需要按点(.)分割成数组,再取数组中最后两个元素组合到一起,即可得到 mazzz.cc。
然而有一些域名却不按“常理”出牌,比如 http://www.baidu.net.cn/ 这个链接,它对应的“顶级域名”实际上是 baidu.net.cn 这个三级域名。类似的域名还有 xxx.com.cn、 xxx.org.cn、xxx.gov.cn 等等。
找了下资料,发现有一个专门的Public Suffix List公共项目,收集了所有的公共域名后缀!
Public Suffix List 是一个不断更新的数据库,旨在为 Web 应用程序提供标准化的接口,以正确处理 Cookie、安全策略和其他与域名相关的问题。这个列表由志愿者维护,并进行严格的验证,确保了数据的质量和准确性。
更妙的是还有个相对应的开源 PHP 库 :https://github.com/jeremykendall/php-domain-parser。不过,这个库需要用 composer 导入,我用的虚拟主机没有 composer。尝试着改了下,要改动的文件实在是太多了。遂放弃。
简单研究了一下 Public Suffix List 的规则列表,发现并不复杂,于是花了点时间自己写了一个轻量级的解析库,无任何其它依赖,支持中文域名解析,支持自动纠错,支持自动更新数据库。测试了一下效果非常棒!
这个库的用法如下:
// 引入模块
include_once('DomainParser.class.php');// 初始化
$parser = new DomainParser();// 更新公共域名后缀数据库(可选,一般每周更新一次就够了,无需每次更新)
// $parser->update();// 解析链接
$url = 'http://test.abc.tool.mkblog.cn/pathto/1';
$result = $parser->parse($url);// 获取结果
if ($result['code'] == 200) {
echo $result['icann'];
}
解析结果
字段 类型 说明
code int 200 - 解析成功 / 其他数值 - 解析失败
msg string 如果解析失败,返回错误消息
host string 返回解析出的 host 部分
icann string 返回基于 Public Suffix List 中 ICANN 规则解析出的顶级域名
private string 返回基于 Public Suffix List 中 PRIVATE 规则解析出的顶级域名
更具体的使用说明可以看 GitHub 上的 README~
4 条评论
hello
2025年10月新盘 做第一批吃螃蟹的人coinsrore.com
新车新盘 嘎嘎稳 嘎嘎靠谱coinsrore.com
新车首发,新的一年,只带想赚米的人coinsrore.com
新盘 上车集合 留下 我要发发 立马进裙coinsrore.com
做了几十年的项目 我总结了最好的一个盘(纯干货)coinsrore.com
新车上路,只带前10个人coinsrore.com
新盘首开 新盘首开 征召客户!!!coinsrore.com
新项目准备上线,寻找志同道合的合作伙伴coinsrore.com
新车即将上线 真正的项目,期待你的参与coinsrore.com
新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com
新盘新盘 这个月刚上新盘 新车第一个吃螃蟹!coinsrore.com
新车新盘 嘎嘎稳 嘎嘎靠谱
2025年10月新盘 做第一批吃螃蟹的人