perl regex correspondente infohash do link magnético
-
15-11-2019 - |
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
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.