MaZzz - 个人笔记站 - 2024年10月
type: channel
link: https://mazzz.cc/index.php/2024/10/
description: MaZzz个人笔记站，一个记录自己学习中遇到的困难的笔记站，主要记录php、Java、Python，Linux及云计算等知识！ 欢迎大家指教、提建议以及提要求！
items: PHP 从链接中提取出顶级域名

PHP 从链接中提取出顶级域名
type: item
date: 2024-10-20T16:37:00+08:00
description: 最近在做某个项目时，收到一个需求是用 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~