关于html:正则表达式,用于查找不在超链接中的URL

Regular expression to find URLs not inside a hyperlink

有很多regex可以匹配一个URL。但是,我尝试匹配不在超链接标记(HREF中的任何位置、内部值等)中出现的URL。因此,这些URL中的任何一个都不应匹配:

1
2
3
something
http://www.example2.com
somethinghttp://www.example.com/<span>test</span>

应匹配之外的任何URL。

我尝试的一种方法是使用一个否定的lookahead来查看URL后面的第一个标记是打开还是关闭。如果是结束的,则URL必须位于超链接内。我认为这个想法是可以的,但是消极的前瞻性regex不起作用(或者更准确地说,regex写得不正确)。任何小费都非常感谢。


你可以分两步来完成,而不是试图想出一个单一的正则表达式:

  • 混合HTML锚定部分(整个锚定标记:开始标记、内容和结束标记)。

  • 匹配URL

  • 在Perl中,它可以是:

    1
    2
    3
    4
    5
    6
    7
    my $curLine = $_; #Do not change $_ if it is needed for something else.
    $curLine =~ ///g; #Remove all of HTML anchor tag,"" and everything in between.
    if ( $curLine =~ /http:\/\//)
    {
      print"Matched an URL outside a HTML anchor !: $_
    ";
    }


    使用dom过滤掉锚元素,然后在其余部分执行一个简单的url regex。


    彼得有一个很好的答案:首先,去掉锚,这样

    1
    Some text TeXt and some more text with link http://a.net

    替换为

    1
    Some text  and some more text with link http://a.net

    然后运行查找URL的regexp:

    1
    http://a.net

    您可以使用一个同时匹配定位标记和超链接的正则表达式来完成此操作:

    1
    2
    # Note that this is a dummy, you'll need a more sophisticated URL regex
    regex = '(]+>)|(http://.*)'

    然后循环结果,只在找到第二个子模式的地方进行进程匹配。