Search code examples
phpurldomain-name

Parsing Domainname From URL In PHP


How I can parse a domain from URL in PHP? It seems that I need a country domain database.

Examples:

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

Can it be done with whois request?

Edit: There are few domain names with .tr (www.nic.tr, www.tsk.tr) the others are as you know: www.something.com.tr, www.something.org.tr

Also there is no www.something.com.bg, www.something.org.bg. They are www.something.bg like the Germans' .de

But there are www.something.a.bg, www.something.b.bg thus a.bg, b.bg, c.bg and so on. (a.bg is like co.uk)

There on the net must be list of these top domain names.

Check how is coloured the url http://www.agrotehnika97.a.bg/ in Internet Explorer. Check also

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

Solution

  • The domain is stored in $_SERVER['HTTP_HOST'].

    EDIT: I believe this returns the whole domain. To just get the top-level domain, you could do this:

    // 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;