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)

マグネット URI スキームに関するウィキペディア

于 2011-11-22T13:11:04.513 に答える
2

上記の正規表現を試してみましたがうまくいかなかったので、自作しました。磁石識別子がBase32であることを示すウィキペディアの磁石 URI スキームを調べました。つまり、次のことを意味します。

Base32 は、A ~ Z の 26 文字と 2 ~ 7 の 6 桁の数字を使用した base-32 転送エンコーディングです。[私の理解では、これらの数字と文字はランダムに補間される可能性があります] .

その結果、正規表現で次のものを探しています。

  • magnet という単語の後にセミコロン、疑問符、および「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 に答える