我正在提取一些维基百科标记,我想要匹配相对(维基百科)链接中的URL。我不想匹配任何包含冒号(不计算协议冒号)的URL,以避免特殊页面等,所以我有以下代码:
while ($body =~ m|<a href="(?<url>/wiki/[^:"]+)|gis) {
my $url = $+{url};
print "$url\n";
}
不幸的是,这段代码并没有像预期的那样运作。任何包含括号的网址[即/wiki/Eon_(geology
)]在开始前的过早被截断,因此该URL将匹配为/wiki/Eon_
。我一直在看代码,我无法弄清楚我做错了什么。任何人都可以提供一些见解吗?
答案 0 :(得分:1)
此代码中没有任何错误,只要您的Perl足够新以支持这些RE功能。用Perl 5.10.1测试。
$body = <<"__ENDHTML__";
<a href="/wiki/Eon_(geology)">Body</a> Blah blah
<a href="/wiki/Some_other_(parenthesis)">Body</a>
__ENDHTML__
while ($body =~ m|<a href="(?<url>/wiki/[^:"]+)|gis) {
my $url = $+{url};
print "$url\n";
}
你使用旧的Perl吗?
答案 1 :(得分:0)
您没有将RE锚定到字符串的末尾。放一个“事后。
虽然这是一个问题,但这不是他试图解决的问题。他试图解决的问题是RE中的方法/主机名(http://en.wiki ...)没有任何匹配。添加。*?在“(?”
之前会有所帮助