从域名中提取顶级域名

时间:2015-04-21 09:58:54

标签: php regex

我有一系列顶级域名,如:

['ag', 'asia', 'asia_sunrise', 'com', 'com.ag', 'org.hn']

鉴于域名,我如何根据上面的数组提取域名的顶级域名?基本上我不关心域有多少级别,我只需要提取顶级域名。

例如:

test1.ag - >应该返回ag

test2.com.ag - >应该返回com.ag

test.test2.com.ag - >应该返回com.ag

test3.org - >应该返回false

由于

5 个答案:

答案 0 :(得分:2)

$domains = ['ag', 'asia', 'asia_sunrise', 'com', 'com.ag', 'org.hn'];

$str = 'test.test2.com.ag'; //your string

preg_match('/\b('.str_replace('.', '\.', implode('|', $domains)).')$/', $str, $matches);
//replace . with \. because . is reserved in regex for any character 

$result = $matches[0] ?: false;

编辑:在regexp中添加单词边界,$ result是您的字符串或false

答案 1 :(得分:1)

更新以合并 Traxo的点关于.通配符;我认为我的答案有点充分,所以我会放弃它,但我们两个基本上都采用相同的解决方案。

//set up test variables
$aTLDList = ['ag', 'asia', 'asia_sunrise', 'com', 'com.ag', 'org.hn'];
$sDomain = "badgers.co.uk"; // for example

//build the match
$reMatch = '/^.*?\.(' . str_replace('.', '\.', implode('|', $aTLDList)) . ')$/';
$sMatchedTLD = preg_match($reMatch, $sDomain) ? 
        preg_replace($reMatch, "$1", $sDomain) : 
        "";

诉诸正则表达式可能过度杀伤,但这是一个简洁的例子。这将为您提供与$sMatchedTLD变量中的空字符串匹配的TLD。

诀窍是让第一个.*匹配 ungreedy .*?)否则 badgers.com.ag 将匹配 ag 而不是 com.ag

答案 2 :(得分:0)

parseurl()函数可让您访问网址的主机名。您可以使用它来处理主机名并查找tld。

$url = 'http://your.url.com.np';
var_dump(parse_url($url, PHP_URL_HOST));

接下来的步骤可能是使用explode()拆分主机名并检查爆炸列表中的最后一项。但是我要把它留给你。

答案 3 :(得分:0)

使用regexp并不是真的需要,所以应该避免使用。

  function topDomain($url) {
      $arr = ['ag', 'asia', 'asia_sunrise', 'com', 'hn'];

      $tld = parse_url($url);
      $toplevel = explode(".", $tld['path'] );
      if(in_array(end($toplevel),$arr)){
         return $url;
      }

PS。 'com.ag'和'org.hn'不是顶级域名,而是二级域名,因此在示例中省略了这些域名。

答案 4 :(得分:0)

首先,您应该提供一个按类似域的长度排序的数组,例如'ag'之前的'com.ag'。然后:

function get_domain($s){
    $a = ['com.ag', 'ag', 'asia_sunrise', 'asia', 'com', 'org.hn'];
    foreach($a as $v){
        if(preg_match("/$v$/",$s)){// if it ends with the array's value
            return $v;
        }
    }
    return false;// if none matched the pattern, loop ends and returns false
}
echo get_domain('test.test2.com.ag');// com.ag