有很多regex可以匹配一个URL。但是,我尝试匹配不在超链接标记(HREF中的任何位置、内部值等)中出现的URL。因此,这些URL中的任何一个都不应匹配:
something
http://www.example2.com
somethinghttp://www.example.com/test
应匹配之外的任何URL。
我尝试的一种方法是使用一个否定的lookahead来查看URL后面的第一个标记是打开还是关闭。如果是结束的,则URL必须位于超链接内。我认为这个想法是可以的,但是消极的前瞻性regex不起作用(或者更准确地说,regex写得不正确)。任何小费都非常感谢。
什么平台?珍珠,网还是爪哇?
仅当文本尚未包装在超链接中时,才可能复制如何在超链接中包装文本
你可以分两步来完成,而不是试图想出一个单一的正则表达式:
混合HTML锚定部分(整个锚定标记:开始标记、内容和结束标记)。
匹配URL
在Perl中,它可以是:
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 !: $_
";
}
如果删除(混合)HTML锚定,我将无法确定URL是否最初位于超链接内,对吗?我只在查找超链接标记之外的URL。
我的意思是:从开始的锚定标记到结束的锚定标记,移除所有东西。
啊,很好的解决办法。我成功了。起初我以为你只是想去掉开始和结束的标签,但是去掉整个标签是个技巧。谢谢您!!
-1您应该通过适当的解析器删除元素,因为HTML不是常规语言。
@斯万特:我觉得这不公平。不是应该直接问这个问题吗?问题是如何与正则表达式匹配。
@对你来说…+ 1
使用dom过滤掉锚元素,然后在其余部分执行一个简单的url regex。
彼得有一个很好的答案:首先,去掉锚,这样
Some text TeXt and some more text with link http://a.net
替换为
Some text and some more text with link http://a.net
。
然后运行查找URL的regexp:
http://a.net
您可以使用一个同时匹配定位标记和超链接的正则表达式来完成此操作:
# Note that this is a dummy, you'll need a more sophisticated URL regex
regex = '(]+>)|(http://.*)'
号
然后循环结果,只在找到第二个子模式的地方进行进程匹配。
这只适用于标记内的URL,而不适用于元素内的URL。此外,它还尝试用正则表达式解析非正则语言。
@斯万特:首先,您可以轻松地扩展示例,使其与和中的所有内容匹配。然后,它就和公认的答案一样,只需一次通过。第二,不,"it"不尝试解析任何东西,而是基于出现的HTML-ish字符串来解析常规语言。如果您只想在字符串中找到简单的模式,就不需要使用功能齐全的HTML解析器。