有许多正则表达式可以匹配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必须位于超链接内。我认为这个想法没问题,但负面的前瞻性正则表达式不起作用(或者更准确地说,正则表达式没有正确编写)。任何提示都非常感谢。
答案 0 :(得分:2)
您可以分两步完成,而不是试图想出一个正则表达式:
混合(无需替换)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";
}
答案 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}$"