【问题标题】:Javascript regex to match fully qualified domain name, without protocol, optional subdomainJavascript 正则表达式匹配完全限定域名,无协议,可选子域
【发布时间】:2013-05-09 14:03:43
【问题描述】:

我一直找不到这个,而且我正在尝试的方法对我来说不太奏效。

我只想匹配符合以下条件的域:

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

将匹配的示例域:

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

匹配的示例域:

  • http://example.com
  • 子域.-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 并且不允许前导连字符。

【问题讨论】:

  • 那你怎么定义“域”呢?每个单词中至少有一个点?
  • 不确定我是否理解。 domain 在 TLD 之前,只能包含字母、数字和连字符。
  • 好吧,那是我(失败的)允许子域的尝试。基本上这就是我被卡住的地方,也是我添加到这个正则表达式的最后一件事。

标签: javascript regex


【解决方案1】:

试试

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

【讨论】:

  • 太棒了,就是这样!谢谢。
  • 我知道这是旧的,但应该更新它以允许 .photography 等具有超过 6 个字符的域
  • @dda 我看到你已经删除了你的 TSE 个人资料(我是在失去 310 分后才知道的)。虽然我没有任何要求的权利,但我希望一切都好。没有你的编辑,那个论坛很无聊。
  • 我不能代表版主说任何话,但我一直认为您的贡献很有价值。我曾经认为有一天你会成为一名出色的版主(我仍然这么认为)。看到你离开我很失望,我希望你们解决问题并回来。
  • 我不知道为什么 TSE 最近会变成这样,但是人群如此之多,以至于我无法为某人说话。我一定会想念你的贡献,我希望你能回来。少数人没有做正确的事并不能真正代表整个社区。​​span>
【解决方案2】:

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

^(?!:\/\/)

这没什么用。虽然它表明了正则表达式的意图,但它是不必要的,因为以下字符无论如何都不允许包含斜杠。

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

【讨论】:

  • 我知道这是旧的,但应该更新它以允许 .photography 等具有超过 6 个字符的域
  • 当然,但是我只分析了问题中提出的正则表达式并使其正常工作(没有评论含义)
  • 是的,你是对的,对不起......但是当我看到它时,我想如果人们寻找答案,他们可能会复制这个而不考虑它的局限性......所以保持原样
【解决方案3】:

试试这个:

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

Demo

【讨论】:

  • 正是我想要的。谢谢!
【解决方案4】:

我在 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

两个表达式都使用前瞻来检查字符串的总长度,最长可达 255 个字符。他们还偷懒检查.{x,y}?

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

【讨论】:

    猜你喜欢
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多