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

时间:2009-08-22 09:53:59

标签: html regex url

有许多正则表达式可以匹配URL。但是,我正在尝试匹配<a>超链接标记(HREF,内部值等)中未出现的网址。因此,这些中的任何URL都不应匹配:

<a href="http://www.example.com/">something</a>
<a href="http://www.example.com/">http://www.example2.com</a>
<a href="http://www.example.com/"><b>something</b>http://www.example.com/<span>test</span></a>

<a></a>以外的任何网址都应匹配。

我尝试过的一种方法是使用否定前瞻功能来查看网址后面的第一个<a>标记是开放<a>还是结束</a>。如果是结束</a>,则URL必须位于超链接内。我认为这个想法没问题,但负面的前瞻性正则表达式不起作用(或者更准确地说,正则表达式没有正确编写)。任何提示都非常感谢。

6 个答案:

答案 0 :(得分:2)

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

  1. 混合(无需替换)HTML锚点部分(整个锚标记:开始标记,内容和结束标记)。

  2. 匹配网址

  3. 在Perl中可能是:

    my $curLine = $_; #Do not change $_ if it is needed for something else.
    $curLine =~ /<a[^<]+<\/a>//g; #Remove all of HTML anchor tag, "<a", "</a>" and everything in between.
    if ( $curLine =~ /http:\/\//)
    {
      print "Matched an URL outside a HTML anchor !: $_\n";
    }
    

答案 1 :(得分:2)

我也在寻找这个答案,因为没有任何东西像我想要的那样真正有效,这是我创建的正则表达式。显然,因为它是一个正则表达式,请注意这不是一个完美的解决方案。

/(?!<a[^>]*>[^<])(((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?))(?![^<]*<\/a>)/gi

更新html的整个函数是:

function linkifyWithRegex(input) {
  let html = input;
  let regx = /(?!<a[^>]*>[^<])(((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?))(?![^<]*<\/a>)/gi;
  html = html.replace(
    regx,
    function (match) {
      return '<a href="' + match + '">' + match + "</a>";
    }
  );
  return html;
}

答案 2 :(得分:0)

您可以使用与锚标记和超链接匹配的单个正则表达式来执行此操作:

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

然后遍历结果,只处理找到第二个子模式的匹配。

答案 3 :(得分:0)

彼得有一个很好的答案:首先,删除锚点,以便

Some text <a href="http://page.net">TeXt</a> and some more text with link http://a.net

替换为

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

然后运行一个找到网址的正则表达式:

http://a.net

答案 4 :(得分:0)

使用DOM过滤出锚元素,然后在其余元素上执行简单的URL正则表达式。

答案 5 :(得分:0)

 ^.*<(a|A){1,1}  ->scan until >a or >A is found
 .*(href|HREF){1,1}\=  -> scan until href= or HREF=
  \x22{1,1}.*\x22  -> accept all characters between two quotes
  > -> look for >
  .+(|){1,1} -> accept description and end anchor tag
  $ -> End of string search


    pattern= "^.*<(a|A){1,1}.*(href|HREF){1,1}.*\=.*\x22{0,1}.*\x22{0,1}.*>.+(|){1,1}$"