【问题标题】:Validate URL domain using regex使用正则表达式验证 URL 域
【发布时间】:2020-04-28 15:04:41
【问题描述】:

我正在尝试以多种格式验证 URL。 例如:

https://www.google.com OK
http://www.google.com  OK
www.google.com     OK
htt://www.google.com
://www.google.com
https://google.com  OK
http\\www.google.com
http:\\www.google.com
http:\\www.google.com
http://computerName/abc/MenuItems.aspx OK
https://computerName/abc/MenuItems.aspx OK
http://www.a.com/abc/ms.aspx?Id=13&(Not.Licensed.For.Production)= OK
http://www.a.com/abc/ms.aspx?Id=13 OK

我正在使用这个正则表达式

^(?:https?:\/\/(?:www\.)?|www\.)[a-z0-9]+(?:[a-zA-Z0-9_\-/\.]+)*(?::[0-9]{1,5})?(?:\/[a-z0-9]+)*(?:\.[a-z]{2,5})?$

但最后两项不行。我如何也可以验证没有 www 和例如(.com)的 url 我试图删除部分(我认为验证 .com 但没有成功。

它几乎可以工作,但发现最后两个不起作用的新案例 这是我的示例https://regex101.com/r/w3dQSl/5

【问题讨论】:

  • 试试^https?:\/\/[a-z0-9]+(?:[-.][a-z0-9]+)*(?::[0-9]{1,5})?(?:\/[a-z0-9]+)*(?:\.[a-z]{2,5})?$ regex101.com/r/nQqxyy/1
  • 只有一个问题。这个 www.google.com 返回 false 并且是一个有效的 URL。
  • 那么你可以匹配 http:// 和可选的 www 部分,或者只匹配 www 部分 regex101.com/r/w3dQSl/1
  • @Thefourthbird 发现了一个不起作用的新案例 :( 尝试完成但没有成功。接下来将发布更新 regex101

标签: regex


【解决方案1】:

对于您的示例链接,您可以使用

^https?:\/\/[a-z0-9]+(?:[-.][a-z0-9]+)*(?::[0-9]{1,5})?(?:\/[^\/\r\n]+)*\.[a-z]{2,5}(?:[?#]\S*)?$

模式将匹配:

  • ^ 字符串开始
  • https?:\/\/ 匹配可选 s 和 :// 的协议
  • [a-z0-9]+ 匹配 1 次以上列出的任何一项
  • (?:[-.][a-z0-9]+)* 重复 0+ 次前面列出的任何 -.
  • (?::[0-9]{1,5})? 可选匹配 : 和 1-5 位
  • (?:\/[^\/\r\n]+)* 重复 0+ 次 / 和除 / 之外的任何字符
  • \.[a-z]{2,5} 匹配 . 和 2-5 次 char a-z
  • (?:[?#]\S*)? 可以选择匹配 ?# 和 0+ 次任何非空白字符
  • $ 字符串结束

Regex demo

【讨论】:

    【解决方案2】:

    您应该考虑尝试匹配哪些 URL,但对于您的示例,这可以完成工作,并且比您提供的初始正则表达式更简单:

    ^(https?://)?(www\.)?[a-zA-Z0-9-]+[a-zA-Z0-9_\-/\.\?=\&\(\)]+$
    

    您可以选择在左括号后添加?: 使某些组不被捕获。

    Debuggex Demo

    【讨论】:

    • @Luis 如果您需要更多帮助,您必须更具体。 Debuggex Demo 显示示例数据中的有效 URL 正确匹配(突出显示)。如果它对您不起作用,您需要提供更多信息,说明出了什么问题、您正在使用什么正则表达式引擎等。在您这样做之前,对我的回答投反对票是没有道理的。
    • @Luis 如果您指的是 regex101 示例的示例数据,请注意所有相关问题信息(尤其是示例数据)应该是帖子本身的一部分。为了使这些也能正常工作,您需要做的就是使用所有允许的字符扩展最后一个字符类,即在您的情况下是 &, ?, (, ) -> Debuggex Demo