Информация о хэше в Perl - PullRequest
       20

Информация о хэше в Perl

3 голосов
/ 01 марта 2012

я пытаюсь извлечь информационный хеш из ссылки на торрент-магнит, используя perls regex
ссылка на магнит выглядит так:

магнит:? Xt = urn: btih: 8AC3731AD4B039C05393B5404AFA6E7397810B41 & dn = ubuntu + 11+ 10 + oneiric + ocelot + рабочий стол + cd + i386 & tr = http% 3A% 2F% 2Ftracker.openbittorrent.com% 2Fannounce

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

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

im, пытающаяся захватить все до первой строки '&', если в ней указана только одна строка, или если в ней есть только строка с информацией о начале или в конце, то в эту строку входит только информация "до", если в нее включена только информацияпара способов, но не могу заставить его работать правильно
то, что у меня ниже, захватывает только первый символ

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

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

Ответы [ 3 ]

4 голосов
/ 01 марта 2012

Вы можете использовать:

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

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

/\burn:btih:([A-F\d]{40})\b/i
2 голосов
/ 01 марта 2012

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

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 100 '* делает ваше регулярное выражение "не жадным", то есть оно будет пытаться использовать как можно меньше символов, в то же время соответствуя указанному вами шаблону. Так

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

просто возвращает "8", а

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

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

if ($tmpVar =~ m/magnet:\?xt=urn:btih:([[:alnum:]]+)/i) {
    $mainRes{'hash'} = $1;
}
0 голосов
/ 10 марта 2012

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

...