Perl Regex Соответствие Infohash из ссылки на магнит

StackOverflow https://stackoverflow.com/questions/9520726

  •  15-11-2019
  •  | 
  •  

Вопрос

Я пытаюсь извлечь инфо-хеш из линии торрентного магнита с использованием Perls Regex
Магнитная ссылка выглядит как:

Магнит :? XT= URN: BTIH: 8AC3731AD4B039C05393B540BAFA6E7397810B41 & DN= Ubuntu + 11 + 10 + Oneiric + Ocelot + Desktop + CD + I386 & TR= http% 3A% 2f% 2ftracker.Openbittorrent.com% 2fance

Но иногда это может выглядеть:

Магнит:? XT= URN: BTIH: 8AC3731AD4B039C05393B5404AFA6E7397810B41

Часть, которую я пытаюсь извлечь 8Ac3731Ad4b039c05393b5404afa6e7397810b41

Я пытаюсь захватить все до первой «и» или, или если он включает в себя только infohash, затем до конца линии, я пробовал пару пары, но не могу заставить его работать правильно

первый символ

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

Я также пытался добавить и | $ после захвата, но это просто приводит к ошибке

Спасибо

Это было полезно?

Решение

You could use:

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

Or if the hash is always 40 chars:

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

Другие советы

As you've already discovered, you don't want to use the ? in your regular-expressions. Here's why:

The ? in pattern+? makes your regex "non-greedy", meaning it will try to use as few characters as possible while still matching the pattern you specify. So

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

just returns "8" while

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

returns the whole string.

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

This is why the gods of CPAN gave us URI, to parse out parts of URIs, which you can then parse with a regex.

#!/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";

Presuming your magnet URI on the command line.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top