Javascript正则表达式匹配完全限定的域名,没有协议,可选的子域名

时间:2013-05-09 14:03:44

标签: javascript regex

我一直无法找到这个,而我正在尝试的并不适合我。

我想只匹配以下域名:

  • 不包含协议(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

它不匹配协议,允许在域内使用连字符,不允许在TLD之后使用尾随字符,并允许子域(但只有1个字符)。

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

4 个答案:

答案 0 :(得分:15)

尝试

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

答案 1 :(得分:4)

让我们分析你的正则表达式:

^(?!:\/\/)

这很没用。虽然它表明正则表达式的意图,但它是不必要的,因为以下字符不允许包含斜杠。

(^[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

答案 2 :(得分:1)

试试这个:

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

Demo

答案 3 :(得分:0)

我在Javascript中执行主机名/ FQDN验证时提出了RegEx:

<强> 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

两个表达式都使用lookahead来检查总字符串长度,最长可达255个字符。他们也进行了懒惰的检查.{x,y}?

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