私はすべてを調べて、YouTubeのURLからビデオIDを解析する多くの方法を見てきましたが、YouTubeのURLが持つ可能性のあるさまざまな形式すべてに一致するものはありませんでした。表示された正規表現をいじってみました以前の投稿では、何も機能しないようでした。
さまざまなURL形式すべてに対応していることがわかった最も近い投稿は次のとおりです: 正規表現を使用して文字列内のすべてのYouTube動画IDを見つけるにはどうすればよいですか?
ただし、これは機能しません: http://www.youtube.com/sandalsResorts#p/c/54B8C800269D7C1B/0/FJUvudQsKCM
私はこれをJavascriptで行っています。誰か助けてもらえますか?
よろしくお願いします。
現在使用しているURL形式とスクリプト:
var url = "http://www.youtube.com/sandalsResorts#p/c/54B8C800269D7C1B/0/FJUvudQsKCM";
//var url = "http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo";
//var url = "http://youtu.be/NLqAF9hrVbY";
//var url = "http://www.youtube.com/embed/NLqAF9hrVbY";
//var url = "https://www.youtube.com/embed/NLqAF9hrVbY";
//var url = "http://www.youtube.com/v/NLqAF9hrVbY?fs=1&hl=en_US";
//var url = "http://www.youtube.com/watch?v=NLqAF9hrVbY";
//var url = "http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo";
//var url = "http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I";
//var url = "http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo";
//var url = "http://www.youtube.com/watch?v=JYArUl0TzhA&feature=featured";
var videoID = url.match(/(?:youtu\.be\/|youtube\.com(?:\/embed\/|\/v\/|\/watch\?v=|\/user\/\S+|\/ytscreeningroom\?v=))([\w\-]{10,12})\b/)[1];
alert(videoID);
これは重複した質問であり、以前に回答されています。
正規表現がここでも機能すると思います。
[〜#〜] edit [〜#〜]:リストの上部にあるsandalsResort URLでは機能しないことに気付きました、正規表現を次のように変更できます(JSで使用するために変換されます)
var myregexp = /(?:youtube\.com\/(?:[^\/]+\/.+\/|(?:v|e(?:mbed)?)\/|.*[?&]v=)|youtu\.be\/)([^"&?\/\s]{11})/gi;
私がしたことは、user
を[^/]+
に置き換えることだけでした。
IDは引き続き後方参照1に取り込まれます。
私はこの正規表現/youtu(?:.*\/v\/|.*v\=|\.be\/)([A-Za-z0-9_\-]{11})/
を使用し、私にとってはうまくいきます。
これらすべての可能なURLを処理する単一の正規表現を記述するのは非常に面倒です。
おそらくif ... else if ... else構造を使用して、URLがどのフォームにあるかを判別し、より小さな特定の正規表現を使用して各ビデオIDを引き出します。
これにはおそらく正規表現は必要ありません。パターンにはほとんど差異がなく、区切り文字自体(/
、および?
、=
、または#
)は不変です。次の移動を決定するために、プレーンな古い文字列操作を使用して、これを段階的に実行することをお勧めします。
/
でURLを分割します。http://
およびwww.
が存在する場合は無視します。youtube.com
またはyoutu.be
であることを確認します。youtu.be
の場合、IDは次のセグメントです。返して止めて。embed
の場合、次のセグメント全体を返します。v
の場合は、?
で分割し、最初の部分を返します。user
の場合は、4つ先のセグメントを数えるとIDを取得できます。watch
の場合は、?
で分割し、次に=
で分割します。...等。
YouTube URLのパターンがいくつあるかはわかりませんが、フォーマットの完全なリストがある場合は、それらの周りにif/elseツリーを作成するだけで済みます。私の主なアドバイスは、/
を分割してそこから移動し、URLのコンテキストヒントを使用して残りの部分を解析する方法を決定することです。
これを試して:
var urls =
["http://www.youtube.com/sandalsResorts#p/c/54B8C800269D7C1B/0/FJUvudQsKCM",
"http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo",
"http://youtu.be/NLqAF9hrVbY",
"http://www.youtube.com/embed/NLqAF9hrVbY",
"https://www.youtube.com/embed/NLqAF9hrVbY",
"http://www.youtube.com/v/NLqAF9hrVbY?fs=1&hl=en_US",
"http://www.youtube.com/watch?v=NLqAF9hrVbY",
"http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo",
"http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I",
"http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo",
"http://www.youtube.com/watch?v=JYArUl0TzhA&feature=featured"];
var ids = [];
for(var i in urls) {
tmp = urls [ i ];
tmp2 = get_video_id(tmp);
if(tmp2 != null)
{
ids.Push("url:" + tmp + " ID:" + tmp2);
}
}
alert(ids.join("\n"));
function get_video_id(input) {
return input.match(/(?:youtu\.be\/|youtube\.com(?:\/embed\/|\/v\/|\/watch\?v=|\/user\/\S+|\/ytscreeningroom\?v=|\/sandalsResorts#\w\/\w\/.*\/))([^\/&]{10,12})/)[1];
}
出力:
url:http://www.youtube.com/sandalsResorts#p/c/54B8C800269D7C1B/0/FJUvudQsKCM ID:FJUvudQsKCM
url:http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo ID:p3vcRhsYGo
url:http://youtu.be/NLqAF9hrVbY ID:NLqAF9hrVbY
url:http://www.youtube.com/embed/NLqAF9hrVbY ID:NLqAF9hrVbY
url:https://www.youtube.com/embed/NLqAF9hrVbY ID:NLqAF9hrVbY
url:http://www.youtube.com/v/NLqAF9hrVbY?fs=1&hl=en_US ID:NLqAF9hrVbY?
url:http://www.youtube.com/watch?v=NLqAF9hrVbY ID:NLqAF9hrVbY
url:http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo ID:p3vcRhsYGo
url:http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I ID:NRHVzbJVx8I
url:http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo ID:p3vcRhsYGo
url:http://www.youtube.com/watch?v=JYArUl0TzhA&feature=featured ID:JYArUl0TzhA
var get_id = function(url){
var code = url.match(/v=([^&#]{5,})/)
return (typeof code[1] == 'string') ? code[1] : false;
}