如何从URL中提取不含www、http前缀且包含TLD的主域名?
PHP提取主域名+TLD组合方案
你目前用parse_url()只能提取完整主机名,没法自动剥离子域名、匹配co.uk这类多级后缀。不需要你自己手动维护所有TLD列表的方案如下:
推荐方案(零手动维护TLD,覆盖所有合法后缀场景)
直接用PHP生态已经封装好公共后缀列表(PSL)的解析库即可,这类库会自动同步官方最新的后缀数据,你不需要自己收集整理任何TLD信息。
- 首先通过composer安装依赖:
composer require league/uri-hostname-parser - 业务代码示例:
<?php require 'vendor/autoload.php'; use League\Uri\HostnameParser; // 初始化解析器,自动加载官方最新公共后缀列表 $parser = HostnameParser::createFromDefaultPublicSuffixList(); // 你的测试输入 $testInputs = [ 'subdomain.example.com', 'https://example.com', 'http://www.example.com', 'example.com', 'www.example.com', 'www.example.co.uk' ]; foreach ($testInputs as $input) { // 先提取主机部分,兼容带协议、路径的输入 $host = parse_url($input, PHP_URL_HOST) ?: $input; // 解析获取主域名+后缀的完整组合 $result = $parser->parse($host)->registrableDomain; echo $result . PHP_EOL; }
上述代码运行后,所有测试用例都会输出你需要的example.com、example.co.uk结果,可覆盖所有合法的顶级、二级甚至三级后缀场景,不需要你手动更新任何TLD数据。
简易替代方案(仅适配简单场景)
如果你的业务场景里输入的子域名只有www这一种,且不需要适配co.uk这类多级后缀,可以直接用字符串处理快速实现:
function getMainDomain($input) { $host = parse_url($input, PHP_URL_HOST) ?: $input; // 去掉开头的www.前缀 return ltrim($host, 'www.'); }
注意该方案仅能覆盖极简单场景,遇到sub.example.co.uk这类输入时会返回错误结果,仅适合临时快速使用。
内容的提问来源于stack exchange,提问作者panthro
相关产品推荐
相关产品推荐

