正则表达式以匹配通用URL

Son*_*ate 0 .net javascript regex

我看了一遍,还没有找到一个解决方案,以满足我对正常表达式模式的需求,该模式将匹配通用URL.我需要支持多种协议(带验证),localhost和/或IP寻址,端口和查询字符串.一些例子:

理想情况下,我希望该模式也支持提取各种元素(协议,主机,端口,查询字符串等),但这不是必需的.

(另外,出于我和未来读者的目的,如果你能解释这种模式,那将会有所帮助.)

Nic*_*rey 5

RFC 3986/STD 0066(统一资源标识符(URI):通用语法)的附录B 提供了您需要的正则表达式:

附录B.使用正则表达式解析URI引用

由于"first-match-wins"算法与POSIX正则表达式使用的"贪婪"消歧方法相同,因此使用正则表达式解析URI引用的潜在五个组件是很自然和平常的.

以下行是用于将格式正确的URI引用分解为其组件的正则表达式.

  ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
   12            3  4          5       6  7        8 9
Run Code Online (Sandbox Code Playgroud)

上面第二行中的数字只是为了提高可读性; 它们表示每个子表达的参考点(即每个配对括号).我们将子表达式匹配的值 <n>称为$<n>.例如,将上面的表达式与之匹配

  http://www.ics.uci.edu/pub/ietf/uri/#Related
Run Code Online (Sandbox Code Playgroud)

导致以下子表达式匹配:

  $1 = http:
  $2 = http
  $3 = //www.ics.uci.edu
  $4 = www.ics.uci.edu
  $5 = /pub/ietf/uri/
  $6 = <undefined>
  $7 = <undefined>
  $8 = #Related
  $9 = Related
Run Code Online (Sandbox Code Playgroud)

where <undefined>表示该组件不存在,如上例中的查询组件的情况.因此,我们可以确定五个组件的值

  scheme    = $2
  authority = $4
  path      = $5
  query     = $7
  fragment  = $9
Run Code Online (Sandbox Code Playgroud)

在相反的方向,我们可以使用第5.3节的算法从其组件重新创建URI引用.

至于针对特定方案验证URI ,您需要查看描述您感兴趣的方案的RFC,以获取验证URI对于该方案是否有效所需的详细信息.声称是.URI方案注册表位于http://www.iana.org/assignments/uri-schemes.html.

即便如此,你注定会遇到某种失败.考虑一下该file:计划.您无法验证它是否代表文件系统中的有效路径authority(除非您权限).您可以做的最好的事情是验证它表示看起来像有效路径的东西.即便如此,一个Windows文件:url like file:///C:/foo/bar/baz/bat.txt(对于运行某种Windows的服务器)的任何东西都是无效的.运行*nix的任何服务器都可能会阻塞它(无论如何,驱动器号是什么?).