2013-05-09 37 views
5

我一直没能找到这个,我试图对我来说不是很努力。Javascript正则表达式,以匹配完全合格的域名,没有协议,可选子域

我想只匹配结构域:

  • 不包含协议(HTTP,HTTPS,FTP)
  • 任选包括子域
  • 没有开始连字符但可以包含连

实施例的结构域将匹配:

  • domain.com
  • example.domain.com
  • example.domain-hyphen.com
  • www.domain.com
  • example.museum

实施例的结构域将不是匹配:

  • http://example.com
  • subdomain.-example.com
  • example.com/parameter
  • example.com?anything
  • www.subdomain.domain.com

目前我有什么:

/^(?!:\/\/)(^[a-zA-Z0-9])?.[a-zA-Z0-9-]+\.[a-zA-Z]{2,6}?$/i 

它不符合协议,允许连字符在域内,不允许在t后跟踪字符他顶级域名,并允许一个子域名(但只有1个字符)。

我仍然需要允许任何长度的子域,不允许www.subdomain.domain.com,并且不允许使用前导连字符。

+0

你如何定义 “域” 呢?每个字都至少有一个点? – Bergi 2013-05-09 14:13:29

+0

不知道我明白。域名位于TLD之前,只能包含字母,数字和连字符。 – 2013-05-09 14:15:06

+0

那么,这是我的(失败)尝试允许子域名。基本上这就是我卡住的地方,也是我添加到这个正则表达式的最后一件事。 – 2013-05-09 14:17:00

回答

12

尝试

/^(?!:\/\/)([a-zA-Z0-9]+\.)?[a-zA-Z0-9][a-zA-Z0-9-]+\.[a-zA-Z]{2,6}?$/i 
+0

真棒伙计,就是这样!谢谢。 – 2013-05-09 14:20:03

+7

我知道这是旧的,但它应该更新,以允许域名,如.photography,它具有超过6个字符 – Nico 2014-08-25 15:34:31

3

我们来分析一下你的正则表达式:

^(?!:\/\/) 

这是相当无用的。虽然它表明了正则表达式的意图,但它是没有必要的,因为不管怎样,下面的字符都不允许包含斜杠。

(^[a-zA-Z0-9])?. 

我想你想这是^([a-zA-Z0-9]+\.)?。您的点不会被转义,并且在字符串开头处只会有一个可选字符。

[a-zA-Z0-9-]+ 

如果你想这不是一开始就有一个连字符,你要么可以使用负前瞻或更好的只是[a-zA-Z0-9][a-zA-Z0-9-]*

\.[a-zA-Z]{2,6}? 

不确定的问号在这里所做的是什么。无论如何都没有回溯?

/i 

这使得明确[a-zA-Z]没用,一个就足够了。或者省略i标志。

所有这些东西放在一起,我们将结束与

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

我知道这是旧的,但它应该更新,以允许域名,如.photography,其中有超过6个字符 – Nico 2014-08-25 15:35:06

+0

当然,但是我只分析了在问题中提出的正则表达式并且使其正常工作(没有对意思进行评论) – Bergi 2014-08-25 15:41:08

+1

是的,您是对的,抱歉...但是当我看到它时,我想如果人们寻找答案,他们可能会复制这一个,甚至没有考虑到它的局限性......所以,保持原样 – Nico 2014-08-26 11:39:06

0

我正则表达式,我想出了,而这样做的主机名/ FQDN验证在javascript:

FQDN:

^(?!:\/\/)(?!.{256,})(([a-z0-9][a-z0-9_-]*?\.)+?[a-z]{2,6}?)$/i

主机名或FQDN

^(?!:\/\/)(?!.{256,})(([a-z0-9][a-z0-9_-]*?)|([a-z0-9][a-z0-9_-]*?\.)+?[a-z]{2,6}?)$/i

两个表达式使用前瞻检查可高达255个字符的总字符串长度。他们也做一个懒惰的检查.{x,y}?

请注意,它使用不区分大小写的匹配/i

0

试试这个:

^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9](?:\.[a-zA-Z]{2,})+$ 

Demo