php. Получить имя домена из ссылки -2
Опубликовано 19 Ноя 2009 в рубрике «php»
К сожалению все стандартные средства не позволяют получить из субдомена имя домена. Сложность здесь заключается в том, что надо отличить домен третьего уровня от субдомена, т.е. для этого придется создавать исключения для всех доменов третьего уровня. И самая большая сложность - получить эти самые всевозможные исключения.
Итак, решая эту проблему я случайно натолкнулся на готовые функции, которые я выложил подкатом:
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%
Полезные записи:
Метки: php
Ваш отзыв