Javascript 匹配通用URL的正则表达式

Javascript 匹配通用URL的正则表达式,javascript,.net,regex,Javascript,.net,Regex,我已经找遍了所有地方,还没有找到一个解决方案来满足我对正则表达式模式的需求,该模式将匹配通用URL。我需要支持多个协议(带有验证)、本地主机和/或IP地址、端口和查询字符串。一些例子: telnet://somesite/page.htm?a=1&b=2 理想情况下,我希望模式也支持提取各种元素(协议、主机、端口、查询字符串等),但这不是一个要求 (另外,为了我自己和未来读者的目的,如果你能解释一下这个模式,这将是很有帮助的。)这可能是在Perl中吗 尝试: 的附录B(统一资源标识符(

我已经找遍了所有地方,还没有找到一个解决方案来满足我对正则表达式模式的需求,该模式将匹配通用URL。我需要支持多个协议(带有验证)、本地主机和/或IP地址、端口和查询字符串。一些例子:

  • telnet://somesite/page.htm?a=1&b=2
理想情况下,我希望模式也支持提取各种元素(协议、主机、端口、查询字符串等),但这不是一个要求


(另外,为了我自己和未来读者的目的,如果你能解释一下这个模式,这将是很有帮助的。)

这可能是在Perl中吗

尝试:

的附录B(统一资源标识符(URI):通用语法)提供了所需的正则表达式:

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

因为“第一场比赛获胜”算法与“贪婪”算法相同 POSIX正则表达式使用的消歧方法,它是 使用正则表达式解析 URI引用的潜在五个组件

下一行是用于分解 格式良好的URI引用到其组件中

  ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
   12            3  4          5       6  7        8 9
上面第二行中的数字仅用于帮助可读性; 它们表示每个子表达式(即每个 成对括号)。我们引用与子表达式匹配的值
$
。例如,将上述表达式与

  http://www.ics.uci.edu/pub/ietf/uri/#Related
导致以下子表达式匹配:

  $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
相反,我们可以从中重新创建URI引用 通过使用第5.3节中的算法实现其组件

至于根据特定方案验证URI,您需要查看描述您感兴趣的方案的RFC,以获得验证URI对其声称的方案有效所需的详细信息。URI方案注册表位于


即使这样,你也注定要失败。考虑<代码>文件:< /代码>方案。您无法验证它是否表示
权限的文件系统中的有效路径(除非您是该权限)。您所能做的最好的事情就是验证它是否表示看起来像有效路径的内容。即使如此,一个windows文件:类似url的
file:///C:/foo/bar/baz/bat.txt
对于除运行某种Windows版本的服务器以外的任何服务器都无效。任何运行*nix的服务器都可能会被它阻塞(驱动器号到底是什么?)

尼古拉斯·凯里(Nicholas Carey)正确地引导您使用RFC-3986。他指出的正则表达式将匹配一个通用URI,但它不会验证它(而且这个正则表达式不适合从“野生”中挑选URL——它太松散,只匹配任何字符串,包括空字符串)

关于验证要求,您可能想看看我写的一篇关于该主题的文章,它从附录a中获取了所有不同组件的所有ABNF语法定义,并提供了regex等价物:

关于从“野生”中挑选URL的主题,请看杰夫·阿特伍德和约翰·格鲁伯的博客文章,以了解可能出现的一些微妙问题。另外,您可能想看看我去年开始的一个项目:-这从可能已经有一些链接的文本中挑选出未链接的HTTP和FTP URL

也就是说,下面是一个PHP函数,它使用稍微修改过的RFC-3986“绝对URI”正则表达式来验证HTTP和FTP URL(使用这个正则表达式,命名的主机部分不能为空)。URI的所有不同组件都被隔离并捕获到命名组中,这使得程序代码中的部分易于操作和验证:

函数url\u有效($url)
{
如果(strpos($url,'www.')==0)$url='http://'。$url;
如果(strpos($url,'ftp.')==0)$url='ftp://'。$url;
如果(!preg_match('/#具有非空、有效DNS主机的有效绝对URI)。
^
(?P[A-Za-z][A-Za-z0-9+\-.]*):\/\/
(?P
(?:(?P(?[A-Za-z0-9\-.~!$&'()*+,;=:]|%[0-9A-Fa-f]{2})*)?
(?P
(?P
\[
(?:
(?P
(?:(?:[0-9A-Fa-f]{1,4}:){6}
|:(?:[0-9A-Fa-f]{1,4}:){5}
|(?:[0-9A-Fa-f]{1,4})::(?:[0-9A-Fa-f]{1,4}):{4}
|(?:(?:[0-9A-Fa-f]{1,4}:){0,1}[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){3}
|(?:(?:[0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})::(?:[0-9A-Fa-f]{1,4}:){2}
|(?:(?:[0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})?::[0-9A-Fa-f]{1,4}:
|(?:(?:[0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})::
)
(?P[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}
| (?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}
(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
)
|(?:(?:[0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})?::[0-9A-Fa-f]{1,4}
|(?:(?:[0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})::
)
|(?P[Vv][0-9A-Fa-f]+\.[A-Za-z0-9\-.~!$&\'()*+,;=:]+)
)
\]
)
|(P(?:(?:25[0-5]| 2[0-4][0-9]|[01]?[0-9][0-9]?)\{3}
(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))
|(?P(?[A-Za-z0-9\-.~!$&'()*+,;=]|%[0-9A-Fa-f]{2})+)
)
(?:(?P[0-9]*))?
)
(?P(?:\/(?:[A-Za-z0-9\-.~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})**))
(?:\?(?(?([A-Za-z0-9\-.!$&'()*+,;=:\\\/?]|%[0-9A-Fa-f]{2})*)?
  $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
  scheme    = $2
  authority = $4
  path      = $5
  query     = $7
  fragment  = $9