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

Ben*_*ada 6 html regex url

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

<a href="http://www.example.com/">某事</a>
<a href="http://www.example.com/">http://www.example2.com</a>
<a href="http://www.example.com/"><b>东西</b>http://www.example.com/<span>test</span></a>

<a></a>应该匹配任何外部的 URL 。

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

小智 5

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

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

更新 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;
}

Run Code Online (Sandbox Code Playgroud)


Pet*_*sen 2

您可以分两步完成,而不是尝试提出单个正则表达式:

  1. 混合(替换为任何内容)HTML 锚点部分(整个锚点标记:开始标记、内容和结束标记)。

  2. 匹配网址

在 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";
}
Run Code Online (Sandbox Code Playgroud)