需要正则表达式来获取域+子域名

时间:2012-01-22 07:47:09

标签: regex dns subdomain

所以我在这里使用这个功能:

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;
}

$referer = get_domain($_SERVER['HTTP_REFERER']);

而我需要的是另一个正则表达式,如果有人愿意帮助的话。 正是我需要的是它获得整个域,包括子域。

让我们说现在是一个真正的问题。当人们博客链接来自示例:myblog.blogger.com referer url将只是blogger.com,这不是理想的..

因此,如果有人可以帮助我,那么我可以将包含子域名作为上述函数的正则表达式代码,id apreciate it alot!

谢谢!

4 个答案:

答案 0 :(得分:9)

此正则表达式应匹配字符串中的域,包括任何dubdomains:

/([a-z0-9|-]+\.)*[a-z0-9|-]+\.[a-z]+/

翻译成粗糙的英语,它的功能如下:“匹配字符串的第一部分'sometextornumbers.sometext',还包括任意数量的'sometextornumbers'。可能先于它。

在此处查看此行动:http://regexr.com?2vppk

请注意,该链接中的多行和全局标志只能匹配整个测试文本blob,因此如果您只将一行传递给正则表达式,则不需要

答案 1 :(得分:0)

祝你好运,因为域名现在包含非罗马字符。在正则表达式可靠地工作之前,必须将它们处理成等效但唯一的ascii。请参阅RFC 3490国际化应用程序中的域名(IDNA)... 见https://tools.ietf.org/html/rfc3490

  

到目前为止,还没有使用域名的标准方法   ASCII指令表以外的字符。本文件定义了   国际化域名(IDN)和称为
的机制   国际化应用程序中的域名(IDNA)以便处理
  他们以标准的方式。 IDN使用从大的字母中抽取的字符   repertoire(Unicode),但IDNA允许非ASCII字符为
  仅使用已经允许的ASCII字符表示   今天叫主机名。这种向后兼容的表示是
  在DNS等现有协议中需要,因此IDN可以是   引入时不改变现有的基础设施。 IDNA是
  仅用于处理域名,而不是自由文本。

答案 2 :(得分:0)

更好的解决方案:

/^([a-z0-9|-]+[a-z0-9]{1,}\.)*[a-z0-9|-]+[a-z0-9]{1,}\.[a-z]{2,}$/

正则表达式示例: https://regexr.com/4k71a

对于电子邮件地址:

/^[a-z0-9|.|-]+[a-z0-9]{1,}@([a-z0-9|-]+[a-z0-9]{1,}\.)*[a-z0-9|-]+[a-z0-9]{1,}\.[a-z]{2,}$/

答案 3 :(得分:-1)

我想这是对第一个建议的优化。 主要改进:

  • 不对无效模式 sub..domain.xyz
  • 做出反应
  • 捕获多个子域作为组
  • 如果给定,则捕获端口
https://((?:[a-z0-9-]+\.)*)([a-z0-9-]+\.[a-z]+)($|\s|\:\d{1,5})

测试一下:https://regex101.com/r/njFIil/1

这个正则表达式不处理任何 unicode 符号,这可能就是上面提到的问题。