帮助破解 Gruber 的 Liberal URL Regex
题
我已经采取了 来自 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'
.