4

如何从 PHP 中的 URL 解析域?看来我需要一个国家域数据库。

例子:

http://mail.google.com/hfjdhfjd/jhfjd.html -> google.com
http://www.google.bg/jhdjhf/djfhj.html -> google.bg
http://www.google.co。 uk/djhdjhf.php -> google.co.uk
http://www.tsk.tr/jhjgc.aspx -> tsk.tr
http://subsub.sub.nic.tr/ -> nic.tr
http:// /subsub.sub.google.com.tr -> google.com.tr
http://subsub.sub.itoy.info.tr -> itoy.info.tr

可以通过whois请求完成吗?

编辑:很少有带有.tr( www.nic.tr, www.tsk.tr) 的域名,其他域名如您所知:www.something.com.tr,www.something.org.tr

也没有www.something.com.bg, www.something.org.bg。他们www.something.bg就像德国人的.de

但是有www.something.a.bg,www.something.b.bg因此a.bg, b.bg,c.bg等等。(a.bg就像co.uk

网上一定有这些顶级域名的列表。

http://www.agrotehnika97.a.bg/检查Internet Explorer中 url 的颜色。还要检查

www.google.co.uk<br>
www.google.com.tr<br>
www.nic.tr<br>
www.tsk.tr
4

4 回答 4

3

域存储在$_SERVER['HTTP_HOST'].

编辑:我相信这会返回整个域。要获得顶级域,您可以这样做:

// Add all your wanted subdomains that act as top-level domains, here (e.g. 'co.cc' or 'co.uk')
// As array key, use the last part ('cc' and 'uk' in the above examples) and the first part as sub-array elements for that key
$allowed_subdomains = array(
    'cc'    => array(
        'co'
    ),
    'uk'    => array(
        'co'
    )
);

$domain = $_SERVER['HTTP_HOST'];
$parts = explode('.', $domain);
$top_level = array_pop($parts);

// Take care of allowed subdomains
if (isset($allowed_subdomains[$top_level]))
{
    if (in_array(end($parts), $allowed_subdomains[$top_level]))
        $top_level = array_pop($parts).'.'.$top_level;
}

$top_level = array_pop($parts).'.'.$top_level;
于 2010-02-24T16:57:43.383 回答
1

你可以用parse_url()它来拆分它并得到你想要的。这是一个例子......

    $url = 'http://www.google.com/search?hl=en&source=hp&q=google&btnG=Google+Search&meta=lr%3D&aq=&oq=dasd';
    print_r(parse_url($url));

会回声...

大批
(
    [方案] => http
    [主机] => www.google.com
    [路径] => /搜索
    [查询] => hl=en&source=hp&q=google&btnG=Google+Search&meta=lr%3D&aq=&oq=dasd
)
于 2010-02-24T17:00:36.377 回答
1

我认为您需要一个域名后使用的所有后缀的列表。 http://publicsuffix.org/list/提供了当前使用的所有后缀的最新(或者他们声称)。列表实际上在这里 现在的想法是让您将该列表解析为一个结构,不同的级别由点分隔,从结束级别开始:

例如,对于域:com.la com.tr com.lc

你最终会得到:

[la]=>[com]
[lc]=>[com]

ETC...

然后,您将从 base_url 获取主机(通过使用 parse_url),然后将其按点分解。然后您开始将值与您的结构匹配,从最后一个开始:

因此,对于 google.com.tr,您首先要匹配 tr,然后是 com,然后一旦您访问 google,您将找不到匹配项,这就是您想要的...

于 2010-02-24T17:16:00.817 回答
1

Regex 和 parse_url() 不是您的解决方案。

您需要使用Public Suffix List的软件包,只有这样您才能正确提取具有二级、三级 TLD(co.uk、a.bg、b.bg 等)的域。我建议使用TLD Extract

这里的代码示例:

$extract = new LayerShifter\TLDExtract\Extract();

$result = $extract->parse('http://subsub.sub.google.com.tr');
$result->getRegistrableDomain(); // will return (string) 'google.com.tr'
于 2016-06-20T10:41:05.547 回答