有许多正则表达式可以匹配 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)
您可以分两步完成,而不是尝试提出单个正则表达式:
混合(替换为任何内容)HTML 锚点部分(整个锚点标记:开始标记、内容和结束标记)。
匹配网址
在 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)