在PHP中从URL解析域名

时间:2010-02-24 16:52:15

标签: php url domain-name

如何在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请求吗?

修改:包含.trwww.nic.trwww.tsk.tr)的域名很少,其他域名如您所知:www.something.com.trwww.something.org.tr

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

一样

但有www.something.a.bgwww.something.b.bg因此a.bgb.bgc.bg等等。 (a.bg就像co.uk

网上必须有这些顶级域名的列表。

检查Internet Explorer中的网址http://www.agrotehnika97.a.bg/是如何着色的。 检查

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

4 个答案:

答案 0 :(得分:2)

域名存储在$_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;

答案 1 :(得分: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));

会回应......

Array
(
    [scheme] => http
    [host] => www.google.com
    [path] => /search
    [query] => hl=en&source=hp&q=google&btnG=Google+Search&meta=lr%3D&aq=&oq=dasd
)

答案 2 :(得分:1)

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

所以例如域名: com.la com.tr com.lc

你最终得到:

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

等...

然后你从base_url获得主机(通过使用parse_url),然后你用点来爆炸它。然后从最后一个开始,将值与结构进行匹配:

所以对于google.com.tr,你首先要匹配tr,然后是com,那么一旦你进入谷歌就不会找到匹配,这就是你想要的......

答案 3 :(得分: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'