-
-
Save dannetstudio/46d5ea6d1f0d6442aa19 to your computer and use it in GitHub Desktop.
PHP code to get the domain name without subdomains (includes the tld, and the special types from IANA). Don't have support for unicode domain names.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| /** | |
| * @param string $domain Pass $_SERVER['SERVER_NAME'] here | |
| * @param bool $debug | |
| * | |
| * @debug bool $debug | |
| * @return string | |
| */ | |
| function get_domain($domain, $debug = false) | |
| { | |
| $original = $domain = strtolower($domain); | |
| if (filter_var($domain, FILTER_VALIDATE_IP)) { return $domain; } | |
| $debug ? print('<strong style="color:green">»</strong> Parsing: '.$original) : false; | |
| $arr = array_slice(array_filter(explode('.', $domain, 4), function($value){ | |
| return $value !== 'www'; | |
| }), 0); //rebuild array indexes | |
| if (count($arr) > 2) | |
| { | |
| $count = count($arr); | |
| $_sub = explode('.', $count === 4 ? $arr[3] : $arr[2]); | |
| $debug ? print(" (parts count: {$count})") : false; | |
| if (count($_sub) === 2) // two level TLD | |
| { | |
| $removed = array_shift($arr); | |
| if ($count === 4) // got a subdomain acting as a domain | |
| { | |
| $removed = array_shift($arr); | |
| } | |
| $debug ? print("<br>\n" . '[*] Two level TLD: <strong>' . join('.', $_sub) . '</strong> ') : false; | |
| } | |
| elseif (count($_sub) === 1) // one level TLD | |
| { | |
| $removed = array_shift($arr); //remove the subdomain | |
| if (strlen($_sub[0]) === 2 && $count === 3) // TLD domain must be 2 letters | |
| { | |
| array_unshift($arr, $removed); | |
| } | |
| else | |
| { | |
| // non country TLD according to IANA | |
| $tlds = array( | |
| 'aaa','aarp','abb','abbott','abogado','ac','academy','accenture','accountant','accountants','aco','active','actor','ad','adac','ads','adult','ae','aeg','aero','af','afl','ag','agency','ai','aig','airforce','airtel','al','alibaba','alipay','allfinanz','alsace','am','amica','amsterdam','analytics','android','ao','apartments','app','apple','aq','aquarelle','ar','aramco','archi','army','arpa','arte','as','asia','associates','at','attorney','au','auction','audi','audio','author','auto','autos','avianca','aw','ax','axa','az','azure','ba','baidu','band','bank','bar','barcelona','barclaycard','barclays','bargains','bauhaus','bayern','bb','bbc','bbva','bcg','bcn','bd','be','beats','beer','bentley','berlin','best','bet','bf','bg','bh','bharti','bi','bible','bid','bike','bing','bingo','bio','biz','bj','black','blackfriday','bloomberg','blue','bm','bms','bmw','bn','bnl','bnpparibas','bo','boats','boehringer','bom','bond','boo','book','boots','bosch','bostik','bot','boutique','br','bradesco','bridgestone','broadway','broker','brother','brussels','bs','bt','budapest','bugatti','build','builders','business','buy','buzz','bv','bw','by','bz','bzh','ca','cab','cafe','cal','call','camera','camp','cancerresearch','canon','capetown','capital','car','caravan','cards','care','career','careers','cars','cartier','casa','cash','casino','cat','catering','cba','cbn','cc','cd','ceb','center','ceo','cern','cf','cfa','cfd','cg','ch','chanel','channel','chase','chat','cheap','chloe','christmas','chrome','church','ci','cipriani','circle','cisco','citic','city','cityeats','ck','cl','claims','cleaning','click','clinic','clinique','clothing','cloud','club','clubmed','cm','cn','co','coach','codes','coffee','college','cologne','com','commbank','community','company','compare','computer','comsec','condos','construction','consulting','contact','contractors','cooking','cool','coop','corsica','country','coupon','coupons','courses','cr','credit','creditcard','creditunion','cricket','crown','crs','cruises','csc','cu','cuisinella','cv','cw','cx','cy','cymru','cyou','cz','dabur','dad','dance','date','dating','datsun','day','dclk','de','dealer','deals','degree','delivery','dell','deloitte','delta','democrat','dental','dentist','desi','design','dev','diamonds','diet','digital','direct','directory','discount','dj','dk','dm','dnp','do','docs','dog','doha','domains','download','drive','dubai','durban','dvag','dz','earth','eat','ec','edeka','edu','education','ee','eg','email','emerck','energy','engineer','engineering','enterprises','epson','equipment','er','erni','es','esq','estate','et','eu','eurovision','eus','events','everbank','exchange','expert','exposed','express','fage','fail','fairwinds','faith','family','fan','fans','farm','fashion','fast','feedback','ferrero','fi','film','final','finance','financial','firestone','firmdale','fish','fishing','fit','fitness','fj','fk','flickr','flights','florist','flowers','flsmidth','fly','fm','fo','foo','football','ford','forex','forsale','forum','foundation','fox','fr','fresenius','frl','frogans','frontier','fund','furniture','futbol','fyi','ga','gal','gallery','gallo','gallup','game','garden','gb','gbiz','gd','gdn','ge','gea','gent','genting','gf','gg','ggee','gh','gi','gift','gifts','gives','giving','gl','glass','gle','global','globo','gm','gmail','gmbh','gmo','gmx','gn','gold','goldpoint','golf','goo','goog','google','gop','got','gov','gp','gq','gr','grainger','graphics','gratis','green','gripe','group','gs','gt','gu','gucci','guge','guide','guitars','guru','gw','gy','hamburg','hangout','haus','hdfcbank','health','healthcare','help','helsinki','here','hermes','hiphop','hitachi','hiv','hk','hm','hn','hockey','holdings','holiday','homedepot','homes','honda','horse','host','hosting','hoteles','hotmail','house','how','hr','hsbc','ht','hu','hyundai','ibm','icbc','ice','icu','id','ie','ifm','iinet','il','im','immo','immobilien','in','industries','infiniti','info','ing','ink','institute','insurance','insure','int','international','investments','io','ipiranga','iq','ir','irish','is','iselect','ist','istanbul','it','itau','iwc','jaguar','java','jcb','je','jetzt','jewelry','jlc','jll','jm','jmp','jo','jobs','joburg','jot','joy','jp','jpmorgan','jprs','juegos','kaufen','kddi','ke','kerryhotels','kerrylogistics','kerryproperties','kfh','kg','kh','ki','kia','kim','kinder','kitchen','kiwi','km','kn','koeln','komatsu','kp','kpn','kr','krd','kred','kuokgroup','kw','ky','kyoto','kz','la','lacaixa','lamborghini','lamer','lancaster','land','landrover','lanxess','lasalle','lat','latrobe','law','lawyer','lb','lc','lds','lease','leclerc','legal','lexus','lgbt','li','liaison','lidl','life','lifeinsurance','lifestyle','lighting','like','limited','limo','lincoln','linde','link','live','living','lixil','lk','loan','loans','locus','lol','london','lotte','lotto','love','lr','ls','lt','ltd','ltda','lu','lupin','luxe','luxury','lv','ly','ma','madrid','maif','maison','makeup','man','management','mango','market','marketing','markets','marriott','mba','mc','md','me','med','media','meet','melbourne','meme','memorial','men','menu','meo','mg','mh','miami','microsoft','mil','mini','mk','ml','mm','mma','mn','mo','mobi','mobily','moda','moe','moi','mom','monash','money','montblanc','mormon','mortgage','moscow','motorcycles','mov','movie','movistar','mp','mq','mr','ms','mt','mtn','mtpc','mtr','mu','museum','mutuelle','mv','mw','mx','my','mz','na','nadex','nagoya','name','natura','navy','nc','ne','nec','net','netbank','network','neustar','new','news','nexus','nf','ng','ngo','nhk','ni','nico','nikon','ninja','nissan','nl','no','nokia','norton','nowruz','np','nr','nra','nrw','ntt','nu','nyc','nz','obi','office','okinawa','om','omega','one','ong','onl','online','ooo','oracle','orange','org','organic','origins','osaka','otsuka','ovh','pa','page','pamperedchef','panerai','paris','pars','partners','parts','party','passagens','pe','pet','pf','pg','ph','pharmacy','philips','photo','photography','photos','physio','piaget','pics','pictet','pictures','pid','pin','ping','pink','pizza','pk','pl','place','play','playstation','plumbing','plus','pm','pn','pohl','poker','porn','post','pr','praxi','press','pro','prod','productions','prof','promo','properties','property','protection','ps','pt','pub','pw','pwc','py','qa','qpon','quebec','quest','racing','re','read','realtor','realty','recipes','red','redstone','redumbrella','rehab','reise','reisen','reit','ren','rent','rentals','repair','report','republican','rest','restaurant','review','reviews','rexroth','rich','ricoh','rio','rip','ro','rocher','rocks','rodeo','room','rs','rsvp','ru','ruhr','run','rw','rwe','ryukyu','sa','saarland','safe','safety','sakura','sale','salon','samsung','sandvik','sandvikcoromant','sanofi','sap','sapo','sarl','sas','saxo','sb','sbs','sc','sca','scb','schaeffler','schmidt','scholarships','school','schule','schwarz','science','scor','scot','sd','se','seat','security','seek','select','sener','services','seven','sew','sex','sexy','sfr','sg','sh','sharp','shaw','shell','shia','shiksha','shoes','show','shriram','si','singles','site','sj','sk','ski','skin','sky','skype','sl','sm','smile','sn','sncf','so','soccer','social','softbank','software','sohu','solar','solutions','song','sony','soy','space','spiegel','spot','spreadbetting','sr','srl','st','stada','star','starhub','statefarm','statoil','stc','stcgroup','stockholm','storage','store','stream','studio','study','style','su','sucks','supplies','supply','support','surf','surgery','suzuki','sv','swatch','swiss','sx','sy','sydney','symantec','systems','sz','tab','taipei','taobao','tatamotors','tatar','tattoo','tax','taxi','tc','tci','td','team','tech','technology','tel','telecity','telefonica','temasek','tennis','tf','tg','th','thd','theater','theatre','tickets','tienda','tiffany','tips','tires','tirol','tj','tk','tl','tm','tmall','tn','to','today','tokyo','tools','top','toray','toshiba','total','tours','town','toyota','toys','tr','trade','trading','training','travel','travelers','travelersinsurance','trust','trv','tt','tube','tui','tunes','tushu','tv','tvs','tw','tz','ua','ubs','ug','uk','unicom','university','uno','uol','us','uy','uz','va','vacations','vana','vc','ve','vegas','ventures','verisign','versicherung','vet','vg','vi','viajes','video','viking','villas','vin','vip','virgin','vision','vista','vistaprint','viva','vlaanderen','vn','vodka','volkswagen','vote','voting','voto','voyage','vu','vuelos','wales','walter','wang','wanggou','watch','watches','weather','weatherchannel','webcam','weber','website','wed','wedding','weir','wf','whoswho','wien','wiki','williamhill','win','windows','wine','wme','wolterskluwer','work','works','world','ws','wtc','wtf','xbox','xerox','xin','xn--11b4c3d','xn--1ck2e1b','xn--1qqw23a','xn--30rr7y','xn--3bst00m','xn--3ds443g','xn--3e0b707e','xn--3pxu8k','xn--42c2d9a','xn--45brj9c','xn--45q11c','xn--4gbrim','xn--55qw42g','xn--55qx5d','xn--6frz82g','xn--6qq986b3xl','xn--80adxhks','xn--80ao21a','xn--80asehdb','xn--80aswg','xn--8y0a063a','xn--90a3ac','xn--90ais','xn--9dbq2a','xn--9et52u','xn--b4w605ferd','xn--bck1b9a5dre4c','xn--c1avg','xn--c2br7g','xn--cck2b3b','xn--cg4bki','xn--clchc0ea0b2g2a9gcd','xn--czr694b','xn--czrs0t','xn--czru2d','xn--d1acj3b','xn--d1alf','xn--e1a4c','xn--eckvdtc9d','xn--efvy88h','xn--estv75g','xn--fhbei','xn--fiq228c5hs','xn--fiq64b','xn--fiqs8s','xn--fiqz9s','xn--fjq720a','xn--flw351e','xn--fpcrj9c3d','xn--fzc2c9e2c','xn--g2xx48c','xn--gckr3f0f','xn--gecrj9c','xn--h2brj9c','xn--hxt814e','xn--i1b6b1a6a2e','xn--imr513n','xn--io0a7i','xn--j1aef','xn--j1amh','xn--j6w193g','xn--jlq61u9w7b','xn--jvr189m','xn--kcrx77d1x4a','xn--kprw13d','xn--kpry57d','xn--kpu716f','xn--kput3i','xn--l1acc','xn--lgbbat1ad8j','xn--mgb9awbf','xn--mgba3a3ejt','xn--mgba3a4f16a','xn--mgbaam7a8h','xn--mgbab2bd','xn--mgbayh7gpa','xn--mgbb9fbpob','xn--mgbbh1a71e','xn--mgbc0a9azcg','xn--mgberp4a5d4ar','xn--mgbpl2fh','xn--mgbt3dhd','xn--mgbtx2b','xn--mgbx4cd0ab','xn--mix891f','xn--mk1bu44c','xn--mxtq1m','xn--ngbc5azd','xn--ngbe9e0a','xn--node','xn--nqv7f','xn--nqv7fs00ema','xn--nyqy26a','xn--o3cw4h','xn--ogbpf8fl','xn--p1acf','xn--p1ai','xn--pbt977c','xn--pgbs0dh','xn--pssy2u','xn--q9jyb4c','xn--qcka1pmc','xn--qxam','xn--rhqv96g','xn--rovu88b','xn--s9brj9c','xn--ses554g','xn--t60b56a','xn--tckwe','xn--unup4y','xn--vermgensberater-ctb','xn--vermgensberatung-pwb','xn--vhquv','xn--vuq861b','xn--w4r85el8fhu5dnra','xn--wgbh1c','xn--wgbl6a','xn--xhq521b','xn--xkc2al3hye2a','xn--xkc2dl3a5ee0h','xn--y9a3aq','xn--yfro4i67o','xn--ygbi2ammx','xn--zfr164b','xperia','xxx','xyz','yachts','yahoo','yamaxun','yandex','ye','yodobashi','yoga','yokohama','youtube','yt','za','zara','zero','zip','zm','zone','zuerich','zw' | |
| ); | |
| if (count($arr) > 2 && in_array($_sub[0], $tlds) !== false) //special TLD don't have a country | |
| { | |
| array_shift($arr); | |
| } | |
| } | |
| $debug ? print("<br>\n" .'[*] One level TLD: <strong>'.join('.', $_sub).'</strong> ') : false; | |
| } | |
| else // more than 3 levels, something is wrong | |
| { | |
| for ($i = count($_sub); $i > 1; $i--) | |
| { | |
| $removed = array_shift($arr); | |
| } | |
| $debug ? print("<br>\n" . '[*] Three level TLD: <strong>' . join('.', $_sub) . '</strong> ') : false; | |
| } | |
| } | |
| elseif (count($arr) === 2) | |
| { | |
| $arr0 = array_shift($arr); | |
| if (strpos(join('.', $arr), '.') === false | |
| && in_array($arr[0], array('localhost','test','invalid')) === false) // not a reserved domain | |
| { | |
| $debug ? print("<br>\n" .'Seems invalid domain: <strong>'.join('.', $arr).'</strong> re-adding: <strong>'.$arr0.'</strong> ') : false; | |
| // seems invalid domain, restore it | |
| array_unshift($arr, $arr0); | |
| } | |
| } | |
| $debug ? print("<br>\n".'<strong style="color:gray">«</strong> Done parsing: <span style="color:red">' . $original . '</span> as <span style="color:blue">'. join('.', $arr) ."</span><br>\n") : false; | |
| return join('.', $arr); | |
| } | |
| $urls = array( | |
| 'www.example.com' => 'example.com', | |
| 'example.com' => 'example.com', | |
| 'example.com.br' => 'example.com.br', | |
| 'www.example.com.br' => 'example.com.br', | |
| 'www.example.gov.br' => 'example.gov.br', | |
| 'localhost' => 'localhost', | |
| 'www.localhost' => 'localhost', | |
| 'subdomain.localhost' => 'localhost', | |
| 'www.subdomain.example.com' => 'example.com', | |
| 'subdomain.example.com' => 'example.com', | |
| 'subdomain.example.com.br' => 'example.com.br', | |
| 'www.subdomain.example.com.br' => 'example.com.br', | |
| 'www.subdomain.example.biz.br' => 'example.biz.br', | |
| 'subdomain.example.biz.br' => 'example.biz.br', | |
| 'subdomain.example.net' => 'example.net', | |
| 'www.subdomain.example.net' => 'example.net', | |
| 'www.subdomain.example.co.kr' => 'example.co.kr', | |
| 'subdomain.example.co.kr' => 'example.co.kr', | |
| 'example.co.kr' => 'example.co.kr', | |
| 'example.jobs' => 'example.jobs', | |
| 'www.example.jobs' => 'example.jobs', | |
| 'subdomain.example.jobs' => 'example.jobs', | |
| 'insane.subdomain.example.jobs' => 'example.jobs', | |
| 'insane.subdomain.example.com.br' => 'example.com.br', | |
| 'www.doubleinsane.subdomain.example.com.br' => 'example.com.br', | |
| 'www.subdomain.example.jobs' => 'example.jobs', | |
| 'test' => 'test', | |
| 'www.test' => 'test', | |
| 'subdomain.test' => 'test', | |
| 'www.detran.sp.gov.br' => 'sp.gov.br', | |
| 'www.mp.sp.gov.br' => 'sp.gov.br', | |
| 'ny.library.museum' => 'library.museum', | |
| 'www.ny.library.museum' => 'library.museum', | |
| 'ny.ny.library.museum' => 'library.museum', | |
| 'www.library.museum' => 'library.museum', | |
| 'info.abril.com.br' => 'abril.com.br', | |
| '127.0.0.1' => '127.0.0.1', | |
| '::1' => '::1', | |
| ); | |
| $failed = 0; | |
| $total = count($urls); | |
| foreach ($urls as $from => $expected) | |
| { | |
| $from = get_domain($from, true); | |
| if ($from !== $expected) | |
| { | |
| $failed++; | |
| print("<div style='color:fuchsia;'>expected {$from} to be {$expected}</div>"); | |
| } | |
| } | |
| if ($failed) | |
| { | |
| print("{$failed} tests failed out of {$total}"); | |
| } | |
| else | |
| { | |
| print("Success"); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment