来自磁力链接的perl正则表达式匹配infohash

时间:2012-03-01 17:11:10

标签: regex perl magnet-uri

我试图使用perls regex从torrent磁力链接中提取信息哈希
磁铁链接如下:

磁体:XT =瓮:btih:8AC3731AD4B039C05393B5404AFA6E7397810B4​​1&安培; DN = ubuntu的+ 11 + 10 + + precise中豹猫+桌面+ CD + I386&安培; TR = HTTP%3A%2F%2Ftracker.openbittorrent.com%2Fannounce

但有时它看起来像:
磁体:XT =瓮:btih:8AC3731AD4B039C05393B5404AFA6E7397810B4​​1

我试图提取的部分是8AC3731AD4B039C05393B5404AFA6E7397810B4​​1

我试图将所有内容捕获到第一个'&'或者,如果它只包括infohash然后直到行的末尾,我尝试了几个但不能让它正常工作我以下我只有捕获第一个字符

if ($tmpVar =~ m/magnet\:\?xt=urn\:btih\:([[:alnum:]]+?)/i) {
  $mainRes{'hash'} = $1;
}

我还尝试在捕获后添加& | $,但这只会导致错误 感谢

3 个答案:

答案 0 :(得分:4)

您可以使用:

/\burn:btih:([A-F\d]+)\b/i

或者,如果哈希总是40个字符:

/\burn:btih:([A-F\d]{40})\b/i

答案 1 :(得分:2)

正如您已经发现的那样,您不希望在正则表达式中使用?。原因如下:

?中的pattern+?使您的正则表达式“非贪婪”,这意味着它会尝试使用尽可能少的字符,同时仍然匹配您指定的模式。所以

"8AC3731AD4B039C05393B5404AFA6E7397810B41" =~ /(\w+?)/

只需在

时返回“8
"8AC3731AD4B039C05393B5404AFA6E7397810B41" =~ /(\w+)/

返回整个字符串。

if ($tmpVar =~ m/magnet:\?xt=urn:btih:([[:alnum:]]+)/i) {
    $mainRes{'hash'} = $1;
}

答案 2 :(得分:0)

这就是为什么CPAN的神给我们URI来解析部分URI,你可以然后用正则表达式解析。

#!/usr/bin/perl
use URI;
use URI::QueryParam;
use Data::Dumper;

my $u = URI->new( shift() );
my $xt = $u->query_form_hash->{xt};

my ($hash) = $xt =~ m{^urn:btih:(.*)$};
print "$hash\n";

在命令行上设置磁体URI。