【问题标题】:Regex to match URL not followed by " or <正则表达式匹配 URL 后不带 " 或 <
【发布时间】:2011-04-15 05:16:01
【问题描述】:

我正在尝试修改http://daringfireball.net/2010/07/improved_regex_for_matching_urls 的 url 匹配正则表达式,使其不匹配任何已经是有效 URL 标记的一部分或用作链接文本的内容。

例如,在下面的字符串中,我想匹配http://www.foo.com,而不是http://www.bar.comhttp://www.baz.com

www.foo.com <a href="http://www.bar.com">http://www.baz.com</a>

我试图添加一个否定的前瞻来排除后跟“或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_\-.:#/~}?]+)(?!["<])

【问题讨论】:

  • 我一直认为使用正则表达式测试工具会有所帮助! gskinner.com/RegExr
  • 谢谢。我一直在使用其中之一。我也会试试这个,看看它是否提供任何其他提示。

标签: regex url pattern-matching


【解决方案1】:

我去年研究了这个问题并开发了一个您可能想要查看的解决方案 - 请参阅:URL Linkification (HTTP/FTP) 此链接是 Javascript 解决方案的测试页面,其中包含许多难以链接的 URL 示例。

我为 PHP 和 Javascript 编写的正则表达式解决方案并不简单(但事实证明也不是问题。)有关更多信息,我建议您阅读:

The Problem With URLs 来自 Jeff Atwood,
An Improved Liberal, Accurate Regex Pattern for Matching URLs 来自 John Gruber

如果您想正确执行此操作,则必须阅读 Jeff 博客文章后的 cmets...

另请注意,John Gruber 的正则表达式有一个组件可以进入灾难性回溯领域(匹配一级匹配括号的部分)。

【讨论】:

  • 谢谢。这是一个非常有用的 url 格式列表。我认为我的问题的症结更多是关于如何在 URL 后面跟着 " 或
【解决方案2】:

是的,如果你只想排除尾随字符,让它工作实际上是微不足道的,只需让你的表达式“独立”,然后在该段中不会发生回溯。

(?&gt;\b ...)(?!["&lt;])

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 2014-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多