可能是一个奇怪的问题,但我确定有人在考虑之前:) 我想知道是否可以使用JS验证给定字符串是否是理论上有效的磁力链接。
关于打开链接等并没有特别困扰(这是在其他地方完成的),我在这里更关心的是清除断开/截断的链接。
我能从脑海中想出的最好的是磁铁的字符串匹配的简单开头:?xt = urn:
我想我可以用一个长度条件(20多个字符似乎合理?)来加序,但有没有人有一个“更好”的解决方案?
答案 0 :(得分: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)
答案 1 :(得分:1)
我能想象的唯一方法是使用正则表达式而不是简单的字符串匹配和长度评估。这将允许您编写关于磁力链接形式的更严格的规则。
如果您不知道正则表达式,这是开始使用它们的正确时刻,它们非常强大,并且它们是每个程序员(无论他感兴趣的语言)的“工具箱”中必须的。
Here is一个起点,但你可以在网上找到大量的文档。
答案 2 :(得分:1)
我尝试了上面的正则表达式并且它不起作用,所以我创建了自己的。我查看了Wikipedia Magnet URI scheme,其中指出磁铁标识符是Base32,这意味着:
Base32是使用二十六个字母A-Z和六个数字2-7的base-32传输编码。 [虽然我的理解是这些数字和字母可以随机插补] 。
因此,我们在正则表达式中寻找以下内容:
/magnet:\?xt=urn:
[a-z0-9]+:
[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!");
}
答案 3 :(得分:0)
JFYI,我在几天前发现了一个类似的问题,我发现磁铁区分大小写并且必须大写(由洪水团队确认),因此验证必须是A-Z,而不是a-z。
有关详情:deluge bug track
与此同时,洪水团队正在修复它,我计划编写一个镀铬扩展程序来修复它,但我现在只是小忙碌:)