我有一系列顶级域名,如:
['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
由于
答案 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