【问题标题】:Regex for URL with port validation带有端口验证的 URL 正则表达式
【发布时间】:2011-06-12 10:27:07
【问题描述】:

我需要像 web 服务器一样验证一个 url。 类似http://localhost:8080/xyz

我们如何使用正则表达式来做到这一点。抱歉,正则表达式的新手。

【问题讨论】:

  • 到目前为止你有什么?
  • 什么你想用正则表达式验证 URL 吗?
  • 您希望正则表达式如何验证 URL?尝试 access 看看你是否得到2xx 不是更好吗?

标签: regex


【解决方案1】:

相关规范可以在rfc 3986 中找到,并包含所有可能的 url 组件的常规语法定义。但是,出于您的目的,这些可能过于笼统。在 http(s) 协议下仅匹配 url 的稍微精简的表达式将是

http[s]?://(([[:alpha:][:digit:]-._~!$&'\(\)*+,;=]|%([0-9A-F]{2}))+|([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]))(:[0-9]+)?(/([[:alpha:][:digit:]-._~!$&'\(\)*+,;=]|%([0-9A-F]{2}))*)+(\?([[:alpha:][:digit:]-._~!$&'\(\)*+,;=/?]|%([0-9A-F]{2}))+)?(#([[:alpha:][:digit:]-._~!$&'\(\)*+,;=/?]|%([0-9A-F]{2}))+)?

可以简化为

http[s]?://(([^/:\.[:space:]]+(\.[^/:\.[:space:]]+)*)|([0-9](\.[0-9]{3})))(:[0-9]+)?((/[^?#[:space:]]+)(\?[^#[:space:]]+)?(\#.+)?)?

如果您对 url 组件的正确语法有信心。

请注意,您可能希望使用更多限制性模式,例如用于全文搜索,并且只允许 iana 注册的*域。

希望对你有帮助,

最好的问候,卡斯滕

【讨论】:

  • 如果尾部有斜杠,则此正则表达式不匹配。您将如何扩展它以匹配尾随斜杠?