【问题标题】:Regex to match all valid links正则表达式匹配所有有效链接
【发布时间】:2010-10-01 08:11:13
【问题描述】:

关于这一点:http://stackoverflow.uservoice.com/pages/general/suggestions/103227-parser-does-not-match-all-valid-urls 这个正则表达式是否足够,或者是否需要对其进行改进,如果需要改进,该怎么做?

\b(?P<link>(?:.*?://)[\w\-\_\.\@\:\/\?\#\=]*)\b

【问题讨论】:

  • 除非我遗漏了什么,否则您的问题非常模糊,即使在点击了一些提供的链接之后也是如此。你想达到什么目的?您尝试匹配哪些 url 格式?

标签: regex url


【解决方案1】:

尽管问题含糊不清,但我会尝试提供可能的解决方案。

可能的意图 1:匹配给定文件中的任何 URL(用于替换):

/^([^:]+):\/\/([-\w._]+)(\/[-\w._]\?(.+)?)?$/ig

上面应该匹配几乎所有的 URL 格式,并带有以下捕获的组:

0 => entire match
1 => protocol (eg. http, ftp, git, ...)
2 => hostname (eg. www.stackoverflow.com)
3 => requested_file_path (eg. /images/prod/1/4/success.gif)
4 => query_string (eg. param=1&param2=2&param3=3)

可能的意图2:获取当前请求url的详细信息

为了获取有关 url 的详细信息,例如协议、主机名、请求的文件路径和查询字符串,您最好使用语言/对象方法来收集结果。在 php 中,您可以使用函数调用获取上述所有信息:

$protocol = $_SERVER['SERVER_PROTOCOL']; // HTTP/1.0
$host = $_SERVER['HTTP_HOST']; // www.stackoverflow.com
$path_to_file = dirname($_SERVER['SCRIPT_NAME']);
$file = basename($_SERVER['SCRIPT_NAME']);
$query_string = $_SERVER['QUERY_STRING'];

希望这对您有所帮助。

【讨论】:

  • 希望我能将此添加为最喜欢的答案
  • @tj111 谢谢!我很高兴能帮上忙。您可以收藏该问题,因此您始终可以快速回复。
  • 不是您的正则表达式中的开始/结束锚字符^$ 错误吗?!
【解决方案2】:

我猜 SO 会在一段时间后阻止 cmets? localshred 的答案很好,除了缺少通配符和未转义的句点:

    /^([^:]+):\/\/([-\w\._]+)(\/[-\w\._]*\?(.+)?)?$/ig
                                        ^-- wildcard
                        ^
    we dont want to match everything ^

【讨论】:

  • 您不需要在范围说明符内转义句点,例如在/.[.]/ 模式中,第一个点表示“任何字符”,而第二个点(在 [括号] 内)表示文字句点。
  • 这也适用于 java 吗?在工作中,我似乎记得在没有逃脱期间得到不同的结果。
猜你喜欢
  • 1970-01-01
  • 2011-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-19
  • 2015-11-28
  • 2010-09-08
相关资源
最近更新 更多