我已经采取了 来自 Daring Fireball 的自由 URL 正则表达式, ,将其与 艾伦·斯托姆 (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' (或者 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 有括号时,正则表达式的一部分不会被执行, ,我已经尝试了一段时间,但似乎找不到解决方案。谁能帮我?

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


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

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

更让我印象深刻的是 格鲁伯艾伦 错过了这个非常简单的错字:

\([\w\d]+\)

不会 \(\w+\) 足够?:S

有帮助吗?

解决方案

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

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

现在工作得很好.

其他提示

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

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

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

这就是我认为这会崩溃的方式......上面正则表达式的位 (sd) 以转义的开括号开头,然后是加注星号的 char 类匹配 sd, ,然后是转义的右括号,接下来是 [^\s()<>]* 哪个匹配 sdsd.com'.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top