Frage

Ich versuche, einen Info-Hash von einem Torrent-Magnet-Link mit Perls Regex zu extrahieren
Der Magnetlink sieht aus wie:

-Magnet:

Aber manchmal kann es aussehen:
Magnet:? XT= Urne: BTIH: 8AC3731AD4B039C05393B5404AFA6E7397810B41

Der Teil, der versuche, extrahiert zu extrahieren, ist 8A3731AD4B039C05393B5404AFA6E7397810B41

Ich versuche, alles bis zum ersten "&" aufzunehmen, oder wenn es nur die InfoHash enthält, dann bis zum Ende der Linie, ich habe es ein paar Wege ausprobiert, aber es kann nicht richtig sein, um richtig zu arbeitendas erste Zeichen generasacodicetagpre.

Ich habe auch versucht und | $ nach der Erfassung, aber das führt nur zu einem Fehler zurück Danke

War es hilfreich?

Lösung

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

Andere Tipps

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top