具有三个点的域的正则表达式: - “gov.ac.in”

时间:2012-04-23 11:43:32

标签: php regex

我们以此格式(http://www.xyz.gov.ac.in)列出了网址。并非所有这些都看起来像这样,其中一些有正常的域名。我对如何从3个虚线网址获取域名感到困惑。我们的代码适用于2个虚线域名。 这是我们的代码:

function get_domain($url)
{
  $pieces = parse_url($url);
  $domain = isset($pieces['host']) ? $pieces['host'] : '';
  if (preg_match('/(?P<domain>[a-z0-9][a-z0-9\-]{1,63}\.[a-z\.]{2,6})$/i', $domain, $regs)) {
    return $regs['domain'];
  }
  return false;
}

echo get_domain($url) ;

我们如何修改上述代码以适应3个虚线域以及其他类型?

回声结果应采用此格式xyz.gov.ac.in

3 个答案:

答案 0 :(得分:1)

基本上,你不能。至少没有一个包含所有“TLD”的查找表。

例如,在我的国家(荷兰),我们有.nl.co.nl。但www.gov.nl是一个普通的网站(我试图说明你不能自动说gov.不是域名)。并且www.edu.nl不存在。

任何尝试解析它们的标准正则表达式都会告诉您该域名为www.gov.nl,而域名实际为gov.nl。与edu.nl相同。

您可以通过获取所有TLD(和子TLD)的列表并使用它来解析它们来实现您想要的唯一方式。

我相信Firefox和Chrome已经实现了这样的列表(用于为URL中的域名着色)并且不断地使其保持最新状态。也许看看那些来源?

答案 1 :(得分:0)

试试这个:

/(^[\w|-]+\.)(?P<domain>([\w|-]+\.)+(\w+))/i    

希望这会有所帮助..

答案 2 :(得分:0)

您应该可以使用此正则表达式

/(?P<domain>([a-z0-9][a-z0-9\-]{1,63}\.)+[a-z\.]{2,6})$/i