К сожалению все стандартные средства не позволяют получить из субдомена имя домена. Сложность здесь заключается в том, что надо отличить домен третьего уровня от субдомена, т.е. для этого придется создавать исключения для всех доменов третьего уровня. И самая большая сложность - получить эти самые всевозможные исключения.
Итак, решая эту проблему я случайно натолкнулся на готовые функции, которые я выложил подкатом:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
// get base domain (domain.tld)
function get_base_domain($url)
{
  $debug = 0;  
  $base_domain = '';
 
  // generic tlds (source: http://en.wikipedia.org/wiki/Generic_top-level_domain)
  $G_TLD = array(
    'biz','com','edu','gov','info','int','mil','name','net','org',
    'aero','asia','cat','coop','jobs','mobi','museum','pro','tel','travel',
    'arpa','root',
    'berlin','bzh','cym','gal','geo','kid','kids','lat','mail','nyc','post','sco','web','xxx',
    'nato',
    'example','invalid','localhost','test',
    'bitnet','csnet','ip','local','onion','uucp',
    'co'   // note: not technically, but used in things like co.uk
  );
 
  // country tlds (source: http://en.wikipedia.org/wiki/Country_code_top-level_domain)
  $C_TLD = array(
    // active
    'ac','ad','ae','af','ag','ai','al','am','an','ao','aq','ar','as','at','au','aw','ax','az',
    'ba','bb','bd','be','bf','bg','bh','bi','bj','bm','bn','bo','br','bs','bt','bw','by','bz',
    'ca','cc','cd','cf','cg','ch','ci','ck','cl','cm','cn','co','cr','cu','cv','cx','cy','cz',
    'de','dj','dk','dm','do','dz','ec','ee','eg','er','es','et','eu','fi','fj','fk','fm','fo',
    'fr','ga','gd','ge','gf','gg','gh','gi','gl','gm','gn','gp','gq','gr','gs','gt','gu','gw',
    'gy','hk','hm','hn','hr','ht','hu','id','ie','il','im','in','io','iq','ir','is','it','je',
    'jm','jo','jp','ke','kg','kh','ki','km','kn','kr','kw','ky','kz','la','lb','lc','li','lk',
    'lr','ls','lt','lu','lv','ly','ma','mc','md','mg','mh','mk','ml','mm','mn','mo','mp','mq',
    'mr','ms','mt','mu','mv','mw','mx','my','mz','na','nc','ne','nf','ng','ni','nl','no','np',
    'nr','nu','nz','om','pa','pe','pf','pg','ph','pk','pl','pn','pr','ps','pt','pw','py','qa',
    're','ro','ru','rw','sa','sb','sc','sd','se','sg','sh','si','sk','sl','sm','sn','sr','st',
    'sv','sy','sz','tc','td','tf','tg','th','tj','tk','tl','tm','tn','to','tr','tt','tv','tw',
    'tz','ua','ug','uk','us','uy','uz','va','vc','ve','vg','vi','vn','vu','wf','ws','ye','yu',
    'za','zm','zw',
    // inactive
    'eh','kp','me','rs','um','bv','gb','pm','sj','so','yt','su','tp','bu','cs','dd','zr'
    );
 
 
  // get domain
  if ( !$full_domain = get_url_domain($url) )
  {
    return $base_domain;
  }
 
  // now the fun
 
    // break up domain, reverse
    $DOMAIN = explode('.', $full_domain);
    if ( $debug ) print_r($DOMAIN);
    $DOMAIN = array_reverse($DOMAIN);
    if ( $debug ) print_r($DOMAIN);
   
    // first check for ip address
    if ( count($DOMAIN) == 4 && is_numeric($DOMAIN[0]) && is_numeric($DOMAIN[3]) )
    {
      return $full_domain;
    }
   
    // if only 2 domain parts, that must be our domain
    if ( count($DOMAIN) <= 2 ) return $full_domain;
   
    /*
      finally, with 3+ domain parts: obviously D0 is tld
      now, if D0 = ctld and D1 = gtld, we might have something like com.uk
      so, if D0 = ctld && D1 = gtld && D2 != 'www', domain = D2.D1.D0
      else if D0 = ctld && D1 = gtld && D2 == 'www', domain = D1.D0
      else domain = D1.D0
      these rules are simplified below
    */

    if ( in_array($DOMAIN[0], $C_TLD) && in_array($DOMAIN[1], $G_TLD) && $DOMAIN[2] != 'www' )
    {
      $full_domain = $DOMAIN[2] . '.' . $DOMAIN[1] . '.' . $DOMAIN[0];
    }
    else
    {
      $full_domain = $DOMAIN[1] . '.' . $DOMAIN[0];;
    }
 
  // did we succeed?  
  return $full_domain;
}
/*____________________________________________________________________________*/


// get domain from url
/*____________________________________________________________________________*/
function get_url_domain($url)
{
  $domain = '';
 
  $_URL = parse_url($url);
 
  // sanity check
  if ( empty($_URL) || empty($_URL['host']) )
  {
    $domain = '';
  }
  else
  {
    $domain = $_URL['host'];
  }
 
  return $domain;
}
/*____________________________________________________________________________*/


// Testbed
/*____________________________________________________________________________*/

if ( 1 )
{
 // test code here
  $TESTURL[] = 'http://blog.org.ua';
  $TESTURL[] = 'http://www.blog.org.ua';
  $TESTURL[] = 'http://subdomen.blog.org.ua';
  $TESTURL[] = 'http://127.0.0.1';
  $TESTURL[] = 'http://www.examplesite.com.pk';
  $TESTURL[] = 'http://domain.tv.com';
  $TESTURL[] = 'http://domain.com.tv';
  $TESTURL[] = 'http://domain.tv';
  $TESTURL[] = 'http://domain.com';
  $TESTURL[] = 'http://secure.email.website.co.uk';
  $TESTURL[] = 'http://username:password@this.is.a.worst.shortly.subdomain.thisIsMyMainWebsite.com.cl';
 
  foreach ( $TESTURL as $url )
  {
    echo $url . ' -> ' . get_base_domain($url) . '
'
;
  }
}

Результат работы скрипта:

1
2
3
4
5
6
7
8
9
10
11
http://blog.org.ua -> blog.org.ua
http://www.blog.org.ua -> blog.org.ua
http://subdomen.blog.org.ua -> blog.org.ua
http://127.0.0.1 -> 127.0.0.1
http://www.examplesite.com.pk -> examplesite.com.pk
http://domain.tv.com -> tv.com
http://domain.com.tv -> domain.com.tv
http://domain.tv -> domain.tv
http://domain.com -> domain.com
http://secure.email.website.co.uk -> website.co.uk
http://username:password@this.is.a.worst.shortly.subdomain.thisIsMyMainWebsite.com.cl -> thisIsMyMainWebsite.com.cl

Популярность: 26%

Полезные записи: