10

从 Daring Fireball 中获取了 Liberal URL Regex,将它与Alan Storm 的一些改进合并,并设法修复了一些错误,例如支持括号内的 IDN 字符。这就是我所拥有的:

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

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

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

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

'www.sampleurl.com'

被正确识别为www.sampleurl.com.

我认为当 URL 有括号时,正则表达式[^[:punct:]\s]|\/一部分没有被执行,我已经尝试了一段时间,但似乎找不到解决方案。谁能帮我?

对于商品,我用正则表达式和一些测试数据设置了一个Rubular 永久链接(最后一个 URL 失败)。


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

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

看到GruberAlan都错过了这个非常简单的错字,我更加印象深刻:

\([\w\d]+\)

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

4

3 回答 3

4

似乎格鲁伯修改了他的正则表达式

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

现在工作得很好

于 2010-01-14T08:01:08.740 回答
1

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

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

于 2010-01-08T10:18:46.813 回答
1
 /(?:[\w-]+:\/\/?|www[.])[^\s()<>]+(?:(?:\([^\s()<>]*\)[^\s()<>]*)+|[^[:punct:]\s]|\/)/
  www.                   |               |            |
                          dsd            |            |
                                          (sd)        |
                                                       sdsd.com'

这就是我认为它崩溃的方式......上面的正则表达式的位(sd)以一个转义的开放括号开始,然后是一个盯着看的 char 类匹配sd,然后是一个转义的结束括号,接下来是[^\s()<>]*which matches sdsd.com'

于 2010-01-12T00:29:15.917 回答