3

我试图使用 perls 正则表达式从 torrent 磁力链接中提取信息哈希,
磁力链接看起来像:

磁铁:?xt=urn:btih:8AC3731AD4B039C05393B5404AFA6E7397810B4​​1&dn=ubuntu+11+10+oneiric+ocelot+desktop+cd+i386&tr=http%3A%2F%2Ftracker.openbittorrent.com%2Fannounce

,但有时它看起来像:
磁铁:? xt=urn:btih:8AC3731AD4B039C05393B5404AFA6E7397810B4​​1

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

我试图捕获第一个'&'之前的所有内容,或者如果它只包含 infohash 然后直到行尾,我尝试了几种方法但无法让它正常工作
我在下面只捕获第一个字符

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

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

4

3 回答 3

4

你可以使用:

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

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

/\burn:btih:([A-F\d]{40})\b/i
于 2012-03-01T17:13:12.940 回答
2

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

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

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

只返回 " 8" 而

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

返回整个字符串。

if ($tmpVar =~ m/magnet:\?xt=urn:btih:([[:alnum:]]+)/i) {
    $mainRes{'hash'} = $1;
}
于 2012-03-01T18:27:43.933 回答
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。

于 2012-03-10T12:01:45.557 回答