【问题标题】:URL Validation RegexURL 验证正则表达式
【发布时间】:2011-10-17 13:13:56
【问题描述】:

据我所知,还有许多其他类似于标题的问题,但我提出这个问题的主要原因是我希望我的验证尽可能完美。这是我的解释哪个 URL 应该有效

http://(如果给定则匹配,否则跳过), domain.com(应该匹配并返回验证) subdomain.domain.com(应该匹配并返回验证) www.com(应该返回假) http://www.com(应该返回 false)

我根据我的需要搜索了很多关于完美正则表达式模式但没有成功的原因,所以我做了我自己并在这里发帖想知道除了http://localhost 之外的任何其他有效 URL 是否会跳过。 如果是,请纠正我。

图案:

((?:http|https|ftp)://)?(?:www.)?((?!www)[A-Z0-9][A-Z0-9_-]*(?: .[A-Z0-9][A-Z0-9_-]*)+):?(\d+)?/?

【问题讨论】:

  • http:// 在上述正则表达式中是可选的
  • 我不确定您要匹配或不匹配的内容与最常用的 URL 匹配表达式不同——www.comhttp://www.com 是完全有效的 URL,每个都转到一个实时网站。你想匹配http://localhost;是否要匹配 IP 地址? -- 如果您告诉我们您使用它的目的,它可能会很有帮助。

标签: php regex validation url


【解决方案1】:

我知道这实际上并不能直接回答您的问题,但除了 REGEX 之外,您还可以使用带有 FILTER_VALIDATE_URL 标志的filter_var(),它在有效 url 的情况下返回 URL,否则返回 FALSE:

   var_dump(filter_var('http://example.com', FILTER_VALIDATE_URL));
   // string(18) http://example.com

您可以阅读here 此函数使用的过滤器,尤其是关于 VALIDATE_URL 过滤器使用的标志的最后一行。

我实际上不知道它是如何在内部实现的,但我想它比你在野外互联网上可以找到的许多正则表达式更好。

【讨论】:

  • @Mr.Shan0 它不再存在了:codepad.viper-7.com/unRBvh - 曾经 bug 但自 5.2.14 和 5.3.3 起已修复。升级你的 php。
  • 是的,我没有注意到,但 filter_var 允许 http://gohttp://localhost 并且我的正则表达式不允许 http://localhost 正如我在问题中所说的那样。