如何检测子域并过滤它?

时间:2010-07-17 06:51:01

标签: php

我确实有域名搜索功能。在搜索框中,您可以选择输入任何类型的域名。我正在研究的是如何从搜索中过滤子域,或者修剪子域并仅保留主域。

例如,如果用户输入mail.yahoo.com然后将其转换为yahoo.com,或者可以从搜索中省略。

3 个答案:

答案 0 :(得分:0)

这是一种更简洁的方法,可以从URL中获取域名和可能的子域名。

function find_subdomain($url) {
    $parts = parse_url($url);
    $domain_parts = explode('.', $parts['host']);
    while(count($domain_parts) > 4)
        array_shift($domain_parts);
    return join('.', $domain_parts);
}

请记住,并非所有看起来像子域的内容都是子域名。某些国家/地区拥有自己的国家/地区特定域名,例如.co.uk.com.au。你不能依赖URL中的点数来告诉你什么是子域而不是子域。事实上,您可能需要相反的方法 - 首先删除top-level domain,然后查看剩下的内容。不幸的是,你只剩下second-level domain problem

您能告诉我们更多关于您要完成的内容吗?您为什么要尝试检测子域名?你提到了一个搜索框。正在搜索什么?


编辑:我已将该功能更新到最多四个最右侧的部分。鉴于“http://one.two.three.four.five.six.com”,它将返回'four.five.six.com'

答案 1 :(得分:0)

我自定义了一个我正在使用的实用程序功能,它接近完美(但这是您可以获得的,而无需对所有可能的域扩展名列表进行硬编码)。

以下是捕获:假设主域包含至少4个字符。即:sub.mail.com,它返回mail.com但是对于sub.aol.com,它返回sub.aol.com

-(CAShapeLayer *)layer
{
   return (CAShapeLayer *)super.layer
}

答案 2 :(得分:-1)

如果您忘记在数组中提及它,那对所有域都不起作用...

这是我的解决方案......但我需要将其压缩到几行......是否可能?

function subdomain($domainb){$bits = explode('/', $domainb);    
if ($bits[0]=='http:' || $bits[0]=='https:'){
$domainb= $bits[2];
} else {$domainb= $bits[0];}
unset($bits);
$bits = explode('.', $domainb); $idz=0;
while (isset($bits[$idz])){$idz+=1;}
$idz-=4; $idy=0;
while ($idy<$idz){ unset($bits[$idy]);
$idy+=1;} $part=array();
foreach ($bits AS $bit){$part[]=$bit;}
unset($bit); unset($bits); unset($domainb);
if (strlen($part[1])>4){ unset($part[0]);}
foreach($part AS $bit){$domainb.=$bit.'.';}
unset($bit);
return preg_replace('/(.*)\./','$1',$domainb);}