如何解决正则表达式匹配不带\\“或<的URL
| 我正在尝试修改http://daringfireball.net/2010/07/improved_regex_for_matching_urls上的url匹配正则表达式,使其不匹配已经是有效URL标记或用作链接文本的任何内容。 例如,在以下字符串中,我要匹配http://www.foo.com,但不匹配http://www.bar.com或http://www.baz.comwww.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_\\-.:#/~}?]+)(?![\"<])
解决方法
是的,如果您只想排除尾随字符,仅使表达式为“ 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的正则表达式具有可进入灾难性回溯领域的部分(与一级匹配括号匹配的部分)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。