Pergunta

estou tentando extrair um hash de informações de um link magnético de torrent usando perls regex
o link magnético se parece com:

ímã :?

mas às vezes pode parecer:
ímã:?xt=urna:btih:8AC3731AD4B039C05393B5404AFA6E7397810B41

a parte que estou tentando extrair é 8AC3731AD4B039C05393B5404AFA6E7397810B41

estou tentando capturar tudo até o primeiro '&' ou se incluir apenas o infohash e até o final da linha, tentei de algumas maneiras, mas não consigo fazer funcionar corretamente
o que tenho abaixo captura apenas o primeiro caractere

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

eu também tentei adicionar &|$ após a captura, mas isso resultou em um erro
Obrigado

Foi útil?

Solução

Você poderia usar:

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

Ou se o hash tiver sempre 40 caracteres:

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

Outras dicas

Como você já descobriu, você não quer usar o ? em suas expressões regulares.Aqui está o porquê:

O ? em pattern+? torna seu regex "não ganancioso", o que significa que ele tentará usar o mínimo de caracteres possível enquanto ainda corresponde ao padrão especificado.Então

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

apenas retorna "8" enquanto

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

retorna a string inteira.

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

É por isso que os deuses do CPAN nos deram URI, para analisar partes de URIs, que você pode então analisar com um 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";

Presumindo seu URI magnético na linha de comando.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top