6

我一直没能找到这个,而且我正在尝试的东西对我来说不太奏效。

我只想匹配以下域:

  • 不包含协议(http、https、ftp)
  • 可选地包括一个子域
  • 不要以连字符开头,但可以包含连字符

匹配的示例域:

  • 域名.com
  • 示例.domain.com
  • example.domain-hyphen.com
  • www.domain.com
  • 例子.museum

匹配的示例域:

  • http://example.com
  • 子域.-example.com
  • example.com/parameter
  • example.com?任何东西
  • 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

4 回答 4

15

尝试

/^(?!:\/\/)([a-zA-Z0-9]+\.)?[a-zA-Z0-9][a-zA-Z0-9-]+\.[a-zA-Z]{2,6}?$/i
于 2013-05-09T14:17:09.467 回答
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
于 2013-05-09T14:24:20.510 回答
2

尝试这个:

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

演示

于 2017-05-23T06:52:47.243 回答
1

我在 Javascript 中进行主机名/FQDN 验证时想到的 RegEx:

全名:

^(?!:\/\/)(?!.{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}?

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

于 2017-01-17T16:07:22.930 回答