一个自由、准确匹配正则表达式模式的url

(2010年7月27日更新:这篇文章已被取代这一个,它提供了一个优越的解决同样的问题。)

一个常见的编程问题:识别url在任意字符串的文本,在通过“任意”我们同意意味着非结构化如电子邮件消息或推特我提供一个解决方案,下面的正则表达式的形式模式:

\ b(((\ w -)+:/ / ? | www[])(^ \ s()< >)+(?:\(\ w \[d]+ \)|([^[punct:]\ s]| /)))

这种模式应该在大多数现代regex实现工作我可以保证它在Perl、Ruby和PCRE正则表达式库(这就意味着它在PHP和BBEdit工作,两者都使用PCRE)。

这种模式的尝试是切实可行的也使得没有人有冲动去解析url根据任何官方规范它不是局限于预定义的URL协议应该是聪明的事情像括号和标点符号例如,它将正确地匹配的URL在下面的例子:

http://foo.com/blah_blah
http://foo.com/blah_blah/
(Something like http://foo.com/blah_blah)
http://foo.com/blah_blah_(wikipedia)
(Something like http://foo.com/blah_blah_(wikipedia))
http://foo.com/blah_blah.
http://foo.com/blah_blah/.
<http://foo.com/blah_blah>
<http://foo.com/blah_blah/>
http://foo.com/blah_blah,
http://www.example.com/wpstyle/?p=364.
http://✪df.ws/123
rdar://1234
rdar:/1234
http://userid:(电子邮件保护):8080
http://(电子邮件保护)http://(电子邮件保护):8080
http://userid:(电子邮件保护)http://example.com:8080 x-yojimbo-item://6303E4C1-xxxx-45A6-AB9D-3A908F59AE0E
message://%(电子邮件保护)%3e
http://➡.ws/䨹
www.➡.ws/䨹
<tag>http://example.com</tag>
Just a www.example.com link.

它试图特别聪明的括号,,根据我的经验,在野外只出现在维基百科上网址,和许多的URL匹配模式似乎糟蹋寻找一条平衡模式括号内的URL,这是如何正确地省略了后面的括号在以下行:

(比如http://foo.com/blah_blah)

The pattern is also liberal about Unicode glyphs within the URL, which allows it, among other things, to match IDN domain names, such as the ✪df.ws domain I registered for the custom URL shortener I use for the万博manbetx贴吧的微博上

欢迎建议和改进,包括发送我输入的电流模式失败例子。

更新,2009年11月28日:艾伦风暴有很大的后续作品。