如何使用Regex&Php验证域名?

Rya*_*yan 18 php regex preg-match

我想要一个解决方案只验证域名不是完整的URL,以下示例是我正在寻找的:

domain.com -> true
domain.net -> true
domain.org -> true
domain.biz -> true
domain.co.uk -> true
sub.domain.com -> true
domain.com/folder -> false
domµ*$ain.com -> false
Run Code Online (Sandbox Code Playgroud)

谢谢

Onu*_*rım 74

所选答案不完整/错误.

正则表达式;

  • 不应该验证领域,如:
    -domain.com,domain--.com,-domain-.-.com,domain.000,等...

  • 验证域名如:
    schools.k12,newTLD.clothing,good.photography,等...

经过一番深入研究; 下面是我能提出的最正确,跨语言和紧凑的模式:

^(?!\-)(?:[a-zA-Z\d\-]{0,62}[a-zA-Z\d]\.){1,126}(?!\d+)[a-zA-Z\d]{1,63}$
Run Code Online (Sandbox Code Playgroud)

此模式符合规范中定义的大多数*规则:

  • 每个标签/级别(由点分割)最多可包含63个字符.
  • 完整域名最多可包含127个级别.
  • 完整域名的文本表示不得超过253个字符的长度.
  • 每个标签可以由字母,数字和连字符组成.
  • 标签不能以连字符开头结尾.
  • 顶级域(扩展名)不能是全数字的.

注1:正则表达式中不包含完整域长度检查.它应该通过原生方法进行简单检查,例如strlen(domain) <= 253.
注2:此模式适用于大多数语言,包括PHP,Javascript,Python等...

请参阅此处的DEMO(适用于JS,PHP,Python)

更多信息:

  • 上面的正则表达式不支持IDN.

  • 没有规范说扩展名(TLD)应该在2到6个字符之间.它实际上支持63个字符.请在此处查看当前的TLD列表.此外,一些网络在内部使用自定义/伪TLD.

  • 注册机构可能会施加一些额外的特定规则,这些规则在此正则表达式中未明确支持.例如,.CO.UK并且.ORG.UK必须至少包含3个字符,但少于23个字符,不包括扩展名.这些规则是非标准的,可能会有变化.如果您无法维护,请不要实施它们.

  • 正则表达式很棒但不是解决每个问题的最有效,最高效的解决方案.因此,应尽可能使用本机URL解析器.例如Python的urlparse()方法或PHP的parse_url()方法......

  • 毕竟,这只是一种格式验证.正则表达式测试不确认域名实际配置/存在!您应该通过提出请求来测试存在.

规格和参考:

  • 不匹配:go.xn - fiqs8s (2认同)

zil*_*n01 23

怎么样:

^(?:[-A-Za-z0-9]+\.)+[A-Za-z]{2,6}$
Run Code Online (Sandbox Code Playgroud)

  • 沮丧的人将其收回.@Lauri` .museum`和`.travel`. (6认同)
  • 答案是(并非完全错误),但**不完整**.请参阅我的答案中的更正. (4认同)
  • 仅当您将正则表达式设置为“/^(?:[-A-Za-z0-9]+\.)+[A-Za-z]{2,6}$/”时,它才适用于 PHP。例如,它可以与“preg_match”函数一起使用,否则则不能。 (3认同)