PHP实现获取url地址中顶级域名的方法示例

文章介绍了使用PHP获取URL地址中顶级域名的四种方法,包括通过`parse_url`函数结合正则表达式判断双后缀,以及根据二级或三级域名识别顶级域名的策略。这些方法适用于构建域名黑名单等场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

做域名黑名单的时候我们需要得到顶级域名。下面总结几种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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值