正则表达式匹配所有有效链接

时间:2009-01-14 09:35:31

标签: regex url

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

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

2 个答案:

答案 0 :(得分:13)

即使问题含糊不清,我也会尝试回答可能的解决方案。

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

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

上述内容应与几乎所有网址格式相匹配,并与以下捕获的群组匹配:

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的详细信息,例如协议,主机名,请求的文件路径和查询字符串,最好使用语言/对象方法来收集结果。在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'];

希望这会有所帮助。

答案 1 :(得分:0)

我想SO会在一段时间后阻止评论? localshred的答案很棒,除了丢失的通配符和未转义的句号:

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