关于这一点:http://stackoverflow.uservoice.com/pages/general/suggestions/103227-parser-does-not-match-all-valid-urls这个正则表达式是否足够,或者需要进一步细化,如果需要进一步细化那么?
\b(?P<link>(?:.*?://)[\w\-\_\.\@\:\/\?\#\=]*)\b
答案 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¶m2=2¶m3=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 ^