3

可能是一个奇怪的问题,但我敢肯定有人以前想过:) 我想知道是否有可能使用 JS 将给定的字符串验证为理论上有效的磁铁链接。

没有特别在意打开链接等(在其他地方已经完成),我更关心的是清除损坏/截断的链接。

我能想到的最好的方法是磁铁的字符串匹配的简单开头:?xt = urn:

我想我可以在前面加上一个长度条件(20+ 个字符似乎合理?),但有人有“更好”的解决方案吗?

4

4 回答 4

4
<!-- 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');
}

短的:

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

维基百科关于 Magnet URI 方案

于 2011-11-22T13:11:04.513 回答
2

我尝试了上面的正则表达式,但它不起作用,所以我创建了自己的。我查看了Wikipedia Magnet URI 方案,其中指出磁铁标识符是Base32,这意味着:

Base32 是使用 26 个字母 AZ 和 6 个数字 2-7 的 base-32 传输编码。[虽然我的理解是这些数字和字母可以随机插值]

因此,我们在正则表达式中寻找以下内容:

  • 磁铁一词后跟一个分号、一个问号和一个“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

于 2013-10-31T12:53:28.210 回答
1

我能想象的唯一方法是使用正则表达式而不是简单的字符串匹配和长度评估。这将允许您编写有关磁力链接形式的更严格的规则。

如果您不了解正则表达式,这是开始使用它们的正确时机,它们非常强大,并且它们是每个程序员(无论他对什么语言感兴趣)的“工具箱”中的必备品。

这是一个起点,但是您可以在线找到大量文档。

于 2011-11-22T13:12:34.203 回答
0

JFYI,我几天前发现了一个类似的问题,我发现磁铁区分大小写并且必须大写(与deluge团队确认),所以验证必须是AZ,而不是az。

更多信息:deluge bug track

与此同时,deluge 团队正在修复它,我正计划编写一个 chrome 扩展来修复它,但我现在有点忙 :)

于 2016-04-15T09:41:39.087 回答