在 php 中获取域名(不是子域)

2022-08-30 12:33:58

我有一个URL,可以是以下任何格式:

http://example.com
https://example.com
http://example.com/foo
http://example.com/foo/bar
www.example.com
example.com
foo.example.com
www.foo.example.com
foo.bar.example.com
http://foo.bar.example.com/foo/bar
example.net/foo/bar

从本质上讲,我需要能够匹配任何正常的URL。我如何提取(或.net,无论tld碰巧是什么。我需要它来与任何TLD一起使用。通过单个正则表达式从所有这些中?example.com


答案 1

好吧,您可以使用来获取主机:parse_url

$info = parse_url($url);
$host = $info['host'];

然后,您可以做一些花哨的事情来仅获得TLD和主机

$host_names = explode(".", $host);
$bottom_host_name = $host_names[count($host_names)-2] . "." . $host_names[count($host_names)-1];

不是很优雅,但应该工作。


如果你想要一个解释,它在这里:

首先,我们抓住方案(等)之间的一切,通过使用 的能力来...井。。。。解析网址。:)http://parse_url

然后,我们获取主机名,并根据句点的位置将其分离到数组中,因此将变为:test.world.hello.myname

array("test", "world", "hello", "myname");

之后,我们取数组中的元素数(4)。

然后,我们从中减去 2,得到倒数第二个字符串(主机名,或,在您的示例中)example

然后,我们从中减去1以获得最后一个字符串(因为数组键从0开始),也称为TLD

然后,我们将这两个部分与句点组合在一起,您就拥有了基本主机名。


答案 2

我在 https://gist.github.com/pocesar/5366899 的解决方案

测试在这里 http://codepad.viper-7.com/GAh1tP

它适用于任何TLD和可怕的子域模式(最多3个子域)。

许多域名都包含一个测试。

不会将函数粘贴到此处,因为StackOverflow中的代码缩进很奇怪(可能有像github这样的围栏代码块)


推荐