做域名黑名单的时候我们需要得到顶级域名。下面总结几种PHP实现获取url地址中顶级域名的方法示例
`
方法一:
<?php
header('content-type:text/html;charset=utf-8');
//获取顶级域名
function getTopHost($url)
{
$url = strtolower($url); //首先转成小写
$hosts = parse_url($url);
$host = $hosts['host'];
//查看是几级域名
$data = explode('.', $host);
$n = count($data);
//判断是否是双后缀
$preg = '/[\w].+\.(com|net|org|gov|edu)\.cn$/';
if (($n > 2) && preg_match($preg, $host)) {
//双后缀取后3位
$host = $data[$n - 3] . '.' . $data[$n - 2] . '.' . $data[$n - 1];
} else {
//非双后缀取后两位
$host = $data[$n - 2] . '.' . $data[$n - 1];
}
return $host;
}
// 测试
echo getTopHost("http://ABC.com/s/j?wd=djl"), '<br>';
echo getTopHost("http://www.abc.com/s/j?wd=djl"), '<br>';
echo getTopHost("http://2.www.abc.com/s/j?wd=djl"), '<br>';
echo getTopHost("https://mp.weixin.qq.com/s?__biz=MzA893ODI3ODU8lzMw=="), '<br>';
echo getTopHost("http://codeit.org.cn/"), '<br>';
echo getTopHost("https://www.sina.com.cn/?from=kandian"), '<br>';
运行结果
abc.com
abc.com
abc.com
qq.com
codeit.org.cn
sina.com.cn
方法二,
/*
* @Project:
* @Date: 2023-04-01 16:36:33
* 落座无言行三载,持笔无悔笑苍生!
*/
/**
* 获取顶级域名
* @param string|null $url
* @return TopDomain
*/
function GetTopDomain(string $url = null)
{
// 判断网址是否带http://或https://
if (preg_match('/^http(s)?:\/\/.+/', $url)) {
$hosts = parse_url(strtolower($url));
$host = $hosts['host'];
} else {
$host = strtolower($url);
}
// 查看是几级域名
$data = explode('.', $host);
$n = count($data);
// 判断是否是双后缀
$preg = '/[w].+.(com|net|org|gov|edu).cn$/';
// 双后缀取后3位
if (($n > 2) && preg_match($preg, $host)) $host = $data[$n - 3] . '.' . $data[$n - 2] . '.' . $data[$n - 1];
// 非双后缀取后两位
else $host = $data[$n - 2] . '.' . $data[$n - 1];
return $host;
}
方法三
//获取顶级域名
function get_host(){
$url = $_SERVER[‘HTTP_HOST’];
$data = explode(‘.’, $url);
$co_ta = count($data);
//判断是否是双后缀
$zi_tow = true;
$host_cn = ‘com.cn,net.cn,org.cn,gov.cn’;
$host_cn = explode(‘,’, $host_cn);
foreach($host_cn as $host){
if(strpos($url,$host)){
$zi_tow = false;
}
}
//如果是返回FALSE ,如果不是返回true
if($zi_tow == true){
$host = $data[$co_ta-2].‘.’.$data[$co_ta-1];
}else{
$host = $data[$co_ta-3].‘.’.$data[$co_ta-2].‘.’.$data[$co_ta-1];
}
return $host;
}
方法四:根据二级域名甚至三级获取其顶级域名
需要识别的二级或三级域名:
$s =<<< TXT
www2.abc.com.cn
www3.abc.com.cn
xx.xx.abc.com.cn
www2.abc.cn
www3.abc.cn
xx.xx.abc.cn
www2.abc.us
www3.abc.us
xx.xx.abc.us
TXT;
2定义你允许识别的国家域名后缀:
$g = explode('|', 'af|aq|at|au|be|bg|br|ca|ch|cl|cn|de|eg|es|fi|fr|gr|hk|hu|ie|il|in|iq|ir|is|it|jp|kr|mx|nl|no|nz|pe|ph|pr|pt|ru|se|sg|th|tr|tw|uk|us|za'); //允许的国家域名
$j = array('com', 'net'); //允许的机构名
3PHP判断其顶级域名的代码
foreach($a as $r) {
echo "$r ==> ";
$n = 0;
$h = array_slice(explode('.', $r), 1); //去掉主机名
if(array_intersect($g, $h)) $n++;
if(array_intersect($j, $h)) $n++;
if($n) echo join('.', array_slice($h, -($n+1)));
echo PHP_EOL;
}
4
完整代码示例:
$s =<<< TXT
www2.abc.com.cn
www3.abc.com.cn
xx.xx.abc.com.cn
www2.abc.cn
www3.abc.cn
xx.xx.abc.cn
www2.abc.us
www3.abc.us
xx.xx.abc.us
TXT;
$a = preg_split("/[\r\n]+/", $s); //待识别域名
$g = explode('|', 'af|aq|at|au|be|bg|br|ca|ch|cl|cn|de|eg|es|fi|fr|gr|hk|hu|ie|il|in|iq|ir|is|it|jp|kr|mx|nl|no|nz|pe|ph|pr|pt|ru|se|sg|th|tr|tw|uk|us|za'); //允许的国家域名
$j = array('com', 'net'); //允许的机构名
foreach($a as $r) {
echo "$r ==> ";
$n = 0;
$h = array_slice(explode('.', $r), 1); //去掉主机名
if(array_intersect($g, $h)) $n++;
if(array_intersect($j, $h)) $n++;
if($n) echo join('.', array_slice($h, -($n+1)));
echo PHP_EOL;
}
运行结果:
www2.abc.com.cn ==> abc.com.cnwww3.abc.com.cn ==> abc.com.cnxx.xx.abc.com.cn ==> abc.com.cnwww2.abc.cn ==> abc.cnwww3.abc.cn ==> abc.cnxx.xx.abc.cn ==> abc.cnwww2.abc.us ==> abc.uswww3.abc.us ==> abc.usxx.xx.abc.us ==> abc.us