2012-03-01 2 views
3

им пытаются извлечь хэша из ссылки торрент магнита с помощью Перлз REGEX
магнит ссылка выглядит следующим образом:
Perl регулярное выражение соответствия infohash от магнита ссылки

магнита: х = урна: btih: 8AC3731AD4B039C05393B5404AFA6E7397810B41 & дп = убунт + 11 + 10 + Oneiric + оцелот + рабочий стол + CD + i386 & тр = HTTP% 3A% 2F% 2Ftracker.openbittorrent.com% 2Fannounce

, но иногда это может выглядеть следующим образом:
магнита: х = урна : btih: 8AC3731AD4B039C05393B5404AFA6E7397810B41

часть им пытаются извлечь это 8AC3731AD4B039C05393B5404AFA6E7397810B41

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

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

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

+0

«просто приводит к ошибке» - это утверждение находится рядом с бесполезным. Вместо этого скажите, какова конкретная ошибка. – TLP

ответ

4

Вы могли бы использовать:

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

Или, если хэш всегда 40 символов:

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

ahh thnx, это был '?' что меня заворачивает – Kr0nZ

+0

yeh, хотя я просто ограничиваю его до 40 символов, но я думаю, что иногда это может быть 32 символа, согласно спецификациям (если я правильно его прочитал) thnx – Kr0nZ

+0

@ Kr0nZ, вы можете использовать '{32, 40}. – Qtax

2

Как вы уже открыли для себя, вы не хотите использовать ? в ваших регулярных выражений , Вот почему:

? в pattern+? делает ваше регулярное выражение «неживым», что означает, что он попытается использовать как можно меньше символов, сохраняя при этом соответствующий шаблон. Так

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

просто возвращает "8" в то время как

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

возвращает всю строку.

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

Вот почему боги CPAN дал нам URI, чтобы разобрать части из URIs, которые вы можете затем синтаксический анализ с регулярным выражением.

#!/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 в командной строке.

 Смежные вопросы

  • Нет связанных вопросов^_^