最直接的方法是使用parse_url()函数获取主机名,但若要提取不含子域名的主域名(如example.com),需借助pdp/pdp等第三方库结合公共后缀列表(PSL)进行精确解析,以正确分离子域名、主域名和多级后缀。

在PHP中从URL获取域名,最直接的方法是使用内置的
parse_url()
host
www.example.com
example.com
parse_url()
host
PHP提供了一个非常实用的内置函数
parse_url()
host
<?php
$url1 = "https://www.example.com/path/to/page?id=123";
$url2 = "http://sub.domain.co.uk:8080/index.html";
$url3 = "ftp://user:pass@ftp.example.net/file.zip";
$url4 = "invalid-url"; // 故意制造一个无效URL
function getHostFromUrl(string $url): ?string {
$parsedUrl = parse_url($url);
// 检查 parse_url 是否成功解析,以及 host 键是否存在
if ($parsedUrl !== false && isset($parsedUrl['host'])) {
return $parsedUrl['host'];
}
return null; // 或者根据业务需求抛出异常
}
echo "URL1 Host: " . (getHostFromUrl($url1) ?? 'N/A') . "\n"; // 输出: www.example.com
echo "URL2 Host: " . (getHostFromUrl($url2) ?? 'N/A') . "\n"; // 输出: sub.domain.co.uk
echo "URL3 Host: " . (getHostFromUrl($url3) ?? 'N/A') . "\n"; // 输出: ftp.example.net
echo "URL4 Host: " . (getHostFromUrl($url4) ?? 'N/A') . "\n"; // 输出: N/A
?>上面的代码片段展示了
parse_url()
www.example.com
sub.domain.co.uk
example.com
domain.co.uk
parse_url()
当我们谈论从URL中“获取域名”时,很多时候我们真正想要的是那个“核心”的、不包含子域名的部分,也就是我们常说的“主域名”或“可注册域名”。
parse_url()
host
blog.tech.example.com
parse_url()['host']
blog.tech.example.com
example.com
立即学习“PHP免费学习笔记(深入)”;
问题就出在这里:如何判断一个域名中的哪些部分是子域名,哪些部分是顶级域名(TLD),哪些部分是主域名?这可不是简单地按点号(
.
.co.uk
.com.cn
.github.io
domain.co.uk
co.uk
.com
.org
.co.uk
.github.io
手动维护和解析这个列表显然是不现实的,而且非常容易出错。因此,我们需要更智能、更健壮的解决方案来应对这种复杂性。
面对
parse_url()
一个非常出色的PHP库是
jeremykendall/php-domain-parser
pdp/pdp
以下是一个使用
pdp/pdp
<?php
require 'vendor/autoload.php'; // 假设你通过Composer安装了该库
use Pdp\Domain;
use Pdp\Manager;
// 初始化Pdp管理器,它会负责加载和更新Public Suffix List
// 在生产环境中,建议缓存PSL文件以提高性能
$manager = new Manager(new Pdp\Storage\PsrStorage(new \GuzzleHttp\Client()));
// 获取公共后缀规则集,首次运行时可能需要下载 public-suffix-list.json
$rules = $manager->getRules();
$url1 = "https://www.example.com/path";
$url2 = "http://sub.domain.co.uk:8080";
$url3 = "http://localhost/test"; // localhost 没有公共后缀
$url4 = "https://myblog.github.io/post"; // github.io 是一个公共后缀
/**
* 从URL中提取可注册域名。
*
* @param string $url 要解析的URL。
* @param Pdp\Rules $rules 公共后缀规则集。
* @return string|null 返回可注册域名或null(如果无法解析)。
*/
function getRegistrableDomainRobust(string $url, Pdp\Rules $rules): ?string {
$host = parse_url($url, PHP_URL_HOST);
if (!$host) {
return null; // URL无效或没有主机名
}
try {
// 使用Pdp库解析主机名
$domain = $rules->resolve(Domain::fromIDNA2008($host));
if ($domain->isIP()) { // 如果是IP地址,直接返回
return $host;
}
if ($domain->isLocalHost()) { // 如果是localhost,直接返回
return $host;
}
// 如果是已知域名且有可注册部分,则返回可注册域名
if ($domain->isKnown() && $domain->getRegistrableDomain()) {
return $domain->getRegistrableDomain()->toString();
}
// 对于其他无法精确解析的情况(如未知公共后缀),可以以上就是PHP如何从URL中获取域名_PHP URL域名提取与解析的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号