试图让"perfect URL validation regex"在 ruby 和 javascript 中工作



我正在寻找检测文本中URL的最佳正则表达式。在尝试了很多之后,我看到了这篇文章,作者在文章中展示了他的regex是众多正则表达式中最健壮的。我正试图让这个正则表达式在Ruby和Javascript中工作,但Rubular和Regexpal都给了我错误。当我试图修复它们时,却找不到匹配项。任何人都很乐意帮助我将这个regex翻译成Ruby和Javascript兼容的版本。

_^(?:(?:https?|ftp)://)(?:S+(?::S*)?@)?(?:(?!10(?:.d{1,3}){3})(?!127(?:.d{1,3}){3})(?!169.254(?:.d{1,3}){2})(?!192.168(?:.d{1,3}){2})(?!172.(?:1[6-9]|2d|3[0-1])(?:.d{1,3}){2})(?:[1-9]d?|1dd|2[01]d|22[0-3])(?:.(?:1?d{1,2}|2[0-4]d|25[0-5])){2}(?:.(?:[1-9]d?|1dd|2[0-4]d|25[0-4]))|(?:(?:[a-zx{00a1}-x{ffff}0-9]+-?)*[a-zx{00a1}-x{ffff}0-9]+)(?:.(?:[a-zx{00a1}-x{ffff}0-9]+-?)*[a-zx{00a1}-x{ffff}0-9]+)*(?:.(?:[a-zx{00a1}-x{ffff}]{2,})))(?::d{2,5})?(?:/[^s]*)?$_iuS

您看到源代码了吗?嵌入了Ruby和JS端口:gist.github.com/dperini/729294.

Ruby:

result = subject.scan(/http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*(),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+/)

Javascript:

result = subject.match(/http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*(),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+/g);

在ruby和javascript中工作的"完美URL验证正则表达式"可能是:

http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*(),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+

DMKE通过将我链接到一些我忽略的来源,最好地回答了我最初的问题,所以我接受了他的回答。但在测试了@diegoperini的正则表达式后,我有点失望。我最终在Daring Fireball上偶然发现了以下正则表达式:

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

它是自由的,接受端口号,链接没有http:或www.,但仍然通过了我的测试。此外,它简单易读。因此,我建议那些想要一个快速、自由的URL正则表达式的人使用这个Regex。

最新更新