Любой способ проверить магнитную ссылку (Javascript) - PullRequest
2 голосов
/ 22 ноября 2011

Возможно странный вопрос, но я уверен, что кто-то думал об этом раньше :) Мне интересно, можно ли вообще проверить данную строку как теоретически допустимую ссылку на магнит, используя JS.

Не особо беспокоит открытие ссылки и т. Д. (Это делается в другом месте), меня больше беспокоит вопрос о том, как отсеять неработающие / усеченные ссылки.

Лучшее, что я могу придумать, это простое начало совпадения строк для магнита:? Xt = urn:

Полагаю, я мог бы предвосхитить это с условием длины (более 20 символов кажется разумным?), Но есть ли у кого-нибудь «лучшее» решение?

Ответы [ 4 ]

4 голосов
/ 22 ноября 2011
<!-- HTML -->
<div id="link">magnet:?xt=urn:3216546465987dfgs9798</div>

JavaScript:

var magnet_link = document.getElementById('link').innerHTML;

if (magnet_link.match(/magnet:\?xt=urn:[a-z0-9]{20,50}/i) != null) {
    alert('Link is valid');
}

Short:

("magnet:?xt=urn:3216546465987dfgs9798".match(/magnet:\?xt=urn:[a-z0-9]{20,50}/i) != null)

Википедия о схеме URI магнита

1 голос
/ 31 октября 2013

Я попробовал приведенное выше регулярное выражение, и оно не сработало, поэтому я создал свое собственное.Я посмотрел на схему URI магнита Википедии , в которой говорится, что идентификатор магнита равен Base32 , что означает:

Base32 - это кодировка передачи base-32 сдвадцать шесть букв А-Я и шесть цифр 2-7. [Хотя я понимаю, что эти цифры и буквы можно интерполировать случайным образом] .

В результате мы ищем следующее в регулярном выражении:

  • Магнит слова, за которым следуют точка с запятой, знак вопроса и строка «xt = urn:»
    • /magnet:\?xt=urn:
  • Любое количество строк/ числа до следующей точки с запятой (регулярное выражение вопроса не соответствует этому)
    • [a-z0-9]+:
  • Из нашего исследования выше, 32 символа (base32) интерполированных букви цифры
    • [a-z0-9]{32}/i

Должно быть начало / и окончание /, поскольку это регулярное выражение для обозначенияначало и конец, а i в конце (/i) обозначает регулярное выражение без учета регистра.Если бы мы не выполняли /i, нам пришлось бы проверять [a-zA-Z0-9].

Последнее регулярное выражение, которое на самом деле работает, выглядит следующим образом:

/magnet:\?xt=urn:[a-z0-9]+:[a-z0-9]{32}/i

Вы можете попробовать это сами:

var torrent = "magnet:?xt=urn:sha1:YNCKHTQCWBTRNJIV4WNAE52SJUQCZO5C";

if (torrent.match(/magnet:\?xt=urn:[a-z0-9]+:[a-z0-9]{32}/i) !== null)
{
    console.log("It's valid, bloody fantastic!");
}

Обязательный JSFiddle .

1 голос
/ 22 ноября 2011

Единственный способ, который я могу себе представить, - это использовать регулярные выражения вместо простого сопоставления строк и оценки длины. Это позволит вам написать более строгие правила о форме ссылки на магнит.

Если вы не знаете регулярных выражений, то это подходящий момент, чтобы начать их использовать, они очень мощные и необходимы в «наборе инструментов» каждого программиста (независимо от языка, который его интересует).

Здесь отправная точка, однако вы можете найти много документации в Интернете.

0 голосов
/ 15 апреля 2016

JFYI, я обнаружил похожую проблему несколько дней назад и обнаружил, что магниты чувствительны к регистру и должны быть написаны заглавными буквами (подтверждено командой deluge), поэтому проверка должна быть A-Z, а не a-z.

Более подробная информация о: трек ошибки потопа

Тем временем команда deluge исправит это, я планирую написать расширение для chrome, чтобы исправить это, но сейчас я немного занят:)

...