如何用PHP从一个网址中获得网站的顶级域名

导语:叶子准备做一个主题授权许可平台,用来给用户授权激活自己写的原创中文主题。设想是使用域名来授权,只有在数据库中存在的域名,才允许使用主题。只判断顶级域名,不判断二级域名。那么我们就需要从网址中读取顶级域名。

将网址去头去尾

一般来说,我们会获取到HTTP或HTTPS开头的网址,那么我们在判断顶级域名的时候需要去掉这些。下面这个函数就是起到这个作用:

public function regular_domain($domain) 

{
	if (substr ( $domain, 0, 7 ) == 'http://') {
		$domain = substr ( $domain, 7 );
	}
	if (substr ( $domain, 0, 8 ) == 'https://') {
		$domain = substr ( $domain, 8 );
	}
	if (strpos ( $domain, '/' ) !== false) {
		$domain = substr ( $domain, 0, strpos ( $domain, '/' ) );
	}
	return strtolower ( $domain );
}

如果是http开头,就从第7位开始截取,如果是https开头,那么从第8位截取。然后查找第一个“/”所在,并把斜杠后面的都抛弃。那么,这样处理后,就到底了一个纯粹的域名,当然这个还不一定是顶级域名。需要下面的函数来判断。

获取顶级域名

什么是顶级域名?举例说明,我的网站www.wordpressleaf.com,这个其实是二级域名,它的顶级域名是wordpressleaf.com,明白了么?凡是前面带了字符的域名,都是二级或者是三级域名了。顶级域名很简单,就是一个词加上点再加上后缀。

所以,我们要获得一个网站的顶级域名,就需要把前面的词都去掉,只剩下“XXX”“.”“com”,“com”是指后缀,它可以是net,也可以是其他。

public function top_domain($domain) {
	$domain = $this->regular_domain ( $domain );
	$iana_root = array (
			'ac',
			'ad',
			'ae',
			'aero',
			'af',
			'ag',
			'ai',
			'al',
			'am',
			'an',
			'ao',
			'aq',
			'ar',
			'arpa',
			'as',
			'asia',
			'at',
			'au',
			'aw',
			'ax',
			'az',
			'ba',
			'bb',
			'bd',
			'be',
			'bf',
			'bg',
			'bh',
			'bi',
			'biz',
			'bj',
			'bl',
			'bm',
			'bn',
			'bo',
			'bq',
			'br',
			'bs',
			'bt',
			'bv',
			'bw',
			'by',
			'bz',
			'ca',
			'cat',
			'cc',
			'cd',
			'cf',
			'cg',
			'ch',
			'ci',
			'ck',
			'cl',
			'cm',
			'cn',
			'co',
			'com',
			'coop',
			'cr',
			'cu',
			'cv',
			'cw',
			'cx',
			'cy',
			'cz',
			'de',
			'dj',
			'dk',
			'dm',
			'do',
			'dz',
			'ec',
			'edu',
			'ee',
			'eg',
			'eh',
			'er',
			'es',
			'et',
			'eu',
			'fi',
			'fj',
			'fk',
			'fm',
			'fo',
			'fr',
			'ga',
			'gb',
			'gd',
			'ge',
			'gf',
			'gg',
			'gh',
			'gi',
			'gl',
			'gm',
			'gn',
			'gov',
			'gp',
			'gq',
			'gr',
			'gs',
			'gt',
			'gu',
			'gw',
			'gy',
			'hk',
			'hm',
			'hn',
			'hr',
			'ht',
			'hu',
			'id',
			'ie',
			'il',
			'im',
			'in',
			'info',
			'int',
			'io',
			'iq',
			'ir',
			'is',
			'it',
			'je',
			'jm',
			'jo',
			'jobs',
			'jp',
			'ke',
			'kg',
			'kh',
			'ki',
			'km',
			'kn',
			'kp',
			'kr',
			'kw',
			'ky',
			'kz',
			'la',
			'lb',
			'lc',
			'li',
			'lk',
			'lr',
			'ls',
			'lt',
			'lu',
			'lv',
			'ly',
			'ma',
			'mc',
			'md',
			'me',
			'mf',
			'mg',
			'mh',
			'mil',
			'mk',
			'ml',
			'mm',
			'mn',
			'mo',
			'mobi',
			'mp',
			'mq',
			'mr',
			'ms',
			'mt',
			'mu',
			'museum',
			'mv',
			'mw',
			'mx',
			'my',
			'mz',
			'na',
			'name',
			'nc',
			'ne',
			'net',
			'nf',
			'ng',
			'ni',
			'nl',
			'no',
			'np',
			'nr',
			'nu',
			'nz',
			'om',
			'org',
			'pa',
			'pe',
			'pf',
			'pg',
			'ph',
			'pk',
			'pl',
			'pm',
			'pn',
			'pr',
			'pro',
			'ps',
			'pt',
			'pw',
			'py',
			'qa',
			're',
			'ro',
			'rs',
			'ru',
			'rw',
			'sa',
			'sb',
			'sc',
			'sd',
			'se',
			'sg',
			'sh',
			'si',
			'sj',
			'sk',
			'sl',
			'sm',
			'sn',
			'so',
			'sr',
			'ss',
			'st',
			'su',
			'sv',
			'sx',
			'sy',
			'sz',
			'tc',
			'td',
			'tel',
			'tf',
			'tg',
			'th',
			'tj',
			'tk',
			'tl',
			'tm',
			'tn',
			'to',
			'tp',
			'tr',
			'travel',
			'tt',
			'tv',
			'tw',
			'tz',
			'ua',
			'ug',
			'uk',
			'um',
			'us',
			'uy',
			'uz',
			'va',
			'vc',
			've',
			'vg',
			'vi',
			'vn',
			'vu',
			'wf',
			'ws',
			'xxx',
			'ye',
			'yt',
			'za',
			'zm',
			'zw' 
	);
	$sub_domain = explode ( '.', $domain );
	$top_domain = '';
	$top_domain_count = 0;
	for($i = count ( $sub_domain ) - 1; $i >= 0; $i --) {
		if ($i == 0) {
			// just in case of something like NAME.COM
			break;
		}
		if (in_array ( $sub_domain [$i], $iana_root )) {
			$top_domain_count ++;
			$top_domain = '.' . $sub_domain [$i] . $top_domain;
			if ($top_domain_count >= 2) {
				break;
			}
		}
	}
	$top_domain = $sub_domain [count ( $sub_domain ) - $top_domain_count - 1] . $top_domain;
	return $top_domain;
}

将域名打散为数组,打散依据就是“.”。然后,用这个数组的元素与域名后缀的数组比较,找出域名后缀前一个词的位置,按照位置截取成顶级域名。

结束

你学会了吗?你可以在本页留言或者加入我们的QQ群一起来交流。QQ群号在首页上有。

发表评论

邮箱地址不会被公开。 必填项已用*标注