分享一段用于分解 URL 的正则表达式
作者:屈超(Chappell.Wat) 发布时间:January 2, 2010 分类:程式::五代
PHP 有一个名为 parse_url 的函数,
其方便之处我就不多置喙了,
总之,
使用它可以将一个形如
http://user:pass@quchao.com:80/about-me/?t=100102#hash
的 URL 分解并返回这样一个数组:
Array
(
[scheme] => http
[host] => hostname
[user] => username
[pass] => password
[path] => /path
[query] => arg=value
[fragment] => anchor
)
而当 F2E 们越来越多地编写与异步、分页和浏览历史等功能相关脚本时,
频繁地操作 URL 就成了一件恼人的事情。
于是不才模仿 parse_url 编写了一段正则来完成这个功能:
^(?<scheme>[^:]+):\/\/(?:(?<username>[^:@]+):?(?<password>[^@]*)@)?(?:(?<hostname>[^/?#:]+):?(?<port>\d*))(?<path>[^?#]*)(?:\?(?<query>[^#]+))?(?:#(?<fragment>.+))?$
令人惋惜的是 Javascript 的正则引擎还不支持自定义分组名,
也不支持大多数的非捕获分组,
因此在 JS 里使用需要“精简”成这样:
'http://user:pass@quchao.com:80/about-me/?t=091226#test'
.match(/^([^:]+):\/\/(?:([^:@]+):?([^@]*)@)?(?:([^/?#:]+):?(\d*))([^?#]*)(?:\?([^#]+))?(?:#(.+))?$/);
当然,
分解出来的各部分顺序与原函数还不尽相同,
必要时大家可以另外封装一层来使用。
最后照例上图:
(虾米,这玩意儿也有图?!)

p.s. 我记得有个可以图形化显示正则匹配过程的网站,
相当地有趣,
敬请各位留言告知。
已经找到,
地址是:http://osteele.com/tools/reanimator/,
可惜功能还不是很强……