正则表达式匹配不带\\“或<的URL

| 我正在尝试修改http://daringfireball.net/2010/07/improved_regex_for_matching_urls上的url匹配正则表达式,使其不匹配已经是有效URL标记或用作链接文本的任何内容。 例如,在以下字符串中,我要匹配http://www.foo.com,但不匹配http://www.bar.com或http://www.baz.com
www.foo.com <a href=\"http://www.bar.com\">http://www.baz.com</a>
我试图添加一个负数前瞻以排除匹配项后跟\“或<,但是由于某种原因,它仅适用于.com中的\” m \“。因此,此正则表达式仍返回http:// www.bar.co和http://www.baz.co作为匹配项。 我看不到自己在做什么错...有什么想法吗?
\\b((?:[a-z][\\w-]+:(?:/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:\'\".,<>?«»“”‘’]))(?![\"<])
这也是一个更简单的示例:
((((ht|f)tps?:\\/\\/)|(www.))[a-zA-Z0-9_\\-.:#/~}?]+)(?![\"<])
    
已邀请:

bab

是的,如果您只想排除尾随字符,仅使表达式为“ independent”,那么实际上使它起作用很简单,那么该段中就不会发生回溯。
(?>\\b ...)(?![\"<])
Perl测试:
use strict;
use warnings;

my $str = \'www.foo.com <a href=\"http://www.bar.com\">http://www.baz.com</a>http://www.some.com\';

while ($str =~ m~
 (?>
    \\b((?:[a-z][\\w-]+:(?:/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:\'\".,<>?«»“”‘’]))
 )
 (?![\"<])
~xg)
{
   print \"$1\\n\";
}
输出:
www.foo.com
http://www.some.com
    
去年,我调查了此问题,并开发了一个可能需要查看的解决方案-请参阅:URL链接化(HTTP / FTP)此链接是Javascript解决方案的测试页,其中包含许多难以链接的URL的示例。 我为PHP和Javascript编写的正则表达式解决方案并不简单(但事实并非如此)。有关更多信息,我建议您也阅读以下内容: URL的问题,作者是Jeff Atwood, John Gruber改进的自由,准确的正则表达式模式,用于匹配URL 如果您想正确执行此操作,必须阅读Jeff \博客文章后的评论... 还请注意,John Gruber的正则表达式具有可进入灾难性回溯领域的部分(与一级匹配括号匹配的部分)。     

要回复问题请先登录注册