JavaScript正则表达式匹配完全限定域名,不包括协议,可选子域名。

7

我还没有找到这个问题的解决方案,现在正在尝试但未成功。

我想要匹配的域名必须满足以下条件:

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

该协议不匹配,允许域名中包含连字符,不允许在顶级域名后添加字符,并允许使用子域名(但只有1个字符)。

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


那么你如何定义“域”呢?是指每个单词中至少有一个点吗? - Bergi
不确定我是否理解。domain 在顶级域名前面,并且只能包含字母、数字和连字符。 - Jared Eitnier
好的,那是我允许子域名的(失败)尝试。基本上这就是我卡住的地方,也是我在这个正则表达式中添加的最后一件事情。 - Jared Eitnier
4个回答

14

尝试

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

10
我知道这个很旧了,但应该更新一下,以允许像 .photography 这样超过6个字符的域名。 - Nico
1
@dda 我看到你已经删除了你的 TSE(翻译搜索工程师)个人资料(我在失去 310 分后得知)。虽然我没有权利问,但我希望一切都好。没有你的编辑,那个论坛变得很无聊。 - Hanky Panky
@HankyPanky 我的一个回答被编辑了,而且不是按照我的意愿,并被锁定,以防止我改回去。这是一系列让我后悔加入TSE的最后一根稻草。很明显,版主们并不欣赏我的工作... - dda
1
我不能代表版主发言,但我一直认为你的贡献非常有价值。我曾经认为你有天成为一个很棒的版主(我现在仍然这么认为)。看到你离开我感到失望,希望你们能解决问题并回来。 - Hanky Panky
1
我不知道为什么最近 TSE 变成了这样,但是由于人数众多,我不能代表任何人说话。我肯定会想念你的贡献,也希望你能回来。一些人做得不对并不能真正代表整个社区。 - Hanky Panky
显示剩余2条评论

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
我知道这很旧,但应该更新以允许像.photography这样有超过6个字符的域名。 - Nico
当然可以,不过我只是分析了问题中提出的正则表达式并使其工作(没有评论其含义)。 - Bergi
1
是的,你说得对,抱歉...但当我看到它时,我想如果人们寻找答案,他们可能会复制这个答案,甚至不考虑它的限制...所以就保留原样吧。 - Nico

4

试试这个:

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

Demo


正是我所需要的。谢谢! - Bryan McGrane

1

我在Javascript中进行主机名/完全限定域名验证时想出了以下正则表达式:

完全限定域名:

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

主机名或完全限定域名

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

两个表达式都使用前瞻来检查总字符串长度,最长可达255个字符。它们还进行了懒惰匹配检查.{x,y}?
请注意,它使用不区分大小写的匹配/i

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接