帮助破解格鲁伯的自由URL正则表达式

时间:2010-01-08 07:13:54

标签: php regex url gruber

我已经使用了Liberal URL Regex from Daring Fireball,将其与some of Alan Storm improvements合并,并且修改了一些错误,例如支持括号内的IDN字符。这就是我所说的:

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

但是我遇到了一个我无法解决的错误:

'www.dsd(sd)sdsd.com' // can also be the valid 'www.dsd.com/whatever(whatever)'

以上网址被识别为www.dsd(sd)sdsd.com'(或www.dsd.com/whatever(whatever)'),而不是www.dsd(sd)sdsd.com(或www.dsd.com/whatever(whatever))。这似乎只在URL有括号时发生,因为以下URL:

'www.sampleurl.com'

正确识别为www.sampleurl.com

我认为正则表达式的[^[:punct:]\s]|\/部分在URL有括号时没有被执行,我已经尝试了一段时间但我似乎无法找到解决方案。任何人都可以帮助我吗?

对于商品,我设置了Rubular permalink with the regex and some test data(最后一个网址失败)。


我认为Gruber的正则表达式有点匆忙,例如它与URL不匹配:

http://en.wikipedia.org/wiki/Something_(Special)_For_You

我看到GruberAlan错过了这个非常简单的拼写错误,我印象更深刻:

\([\w\d]+\)

\(\w+\)不够吗? :S

3 个答案:

答案 0 :(得分:4)

似乎像Gruber has revised his regular expression

\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.])(?:[^\s()<>]+|\([^\s()<>]+\))+(?:\([^\s()<>]+\)|[^`!()\[\]{};:'".,<>?«»“”‘’\s]))

Works just fine now

答案 1 :(得分:1)

www.dsd(sd)sdsd.com不是有效的域名。

如果您有'www.dsd.com/whatever(whatever)',则会被正确识别。 (或至少在我的测试中)

答案 2 :(得分:1)

 /(?:[\w-]+:\/\/?|www[.])[^\s()<>]+(?:(?:\([^\s()<>]*\)[^\s()<>]*)+|[^[:punct:]\s]|\/)/
  www.                   |               |            |
                          dsd            |            |
                                          (sd)        |
                                                       sdsd.com'

这就是我认为这种情况发生故障...... (sd)上面的正则表达式的开头是一个逃脱的开放式paren,然后是一个匹配sd的凝视的char类,然后是一个逃脱的关闭paren,以及接下来是[^\s()<>]*sdsd.com'匹配。