如何从url获取YouTubevideoID?

我想从JavaScript的URL中获取v=id (不含jQuery,纯JavaScript)。

YouTubeurl格式示例

http://www.youtube.com/watch?v=u8nQa1cJyX8&a=GxdCwVVULXctT2lYDEPllDR0LRTutYfW

http://www.youtube.com/watch?v=u8nQa1cJyX8

或者在url中包含任何其他YouTube格式的videoID。

来自这些格式的结果

u8nQa1cJyX8

你不需要使用这个正则expression式。

 var video_id = window.location.search.split('v=')[1]; var ampersandPosition = video_id.indexOf('&'); if(ampersandPosition != -1) { video_id = video_id.substring(0, ampersandPosition); } 

我对“jeffreypriebe”提供的正则expression式进行了增强,因为他需要一种YouTube URL,它是通过频道查看video的URL。

不,但这是我武装的function。

 <script type="text/javascript"> function youtube_parser(url){ var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/; var match = url.match(regExp); return (match&&match[7].length==11)? match[7] : false; } </script> 

这些是支持的URLtypes

 http://www.youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index http://www.youtube.com/user/IngridMichaelsonVEVO#p/a/u/1/QdK8U-VIH_o http://www.youtube.com/v/0zM3nApSvMg?fs=1&amp;hl=en_US&amp;rel=0 http://www.youtube.com/watch?v=0zM3nApSvMg#t=0m10s http://www.youtube.com/embed/0zM3nApSvMg?rel=0 http://www.youtube.com/watch?v=0zM3nApSvMg http://youtu.be/0zM3nApSvMg 

y可以在http://lasnv.net/foro/839/Javascript_parsear_URL_de_YouTube (截止date)

我简化了Lasnv的回答。

它也修复了WebDeb描述的错误。

这里是:

 var regExp = /^.*(youtu\.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/; var match = url.match(regExp); if (match && match[2].length == 11) { return match[2]; } else { //error } 

这里是一个regexer链接玩: http ://regexr.com/3dnqv

在2015年1月1日之前,这些工作都没有在厨房的水槽上工作,尤其是没有协议的url和YouTube的域名。 所以这是一个适用于所有这些不同的YouTube版本的修改版本:

 // Just the regex. Output is in [1]. /^.*(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/)|(?:(?:watch)?\?v(?:i)?=|\&v(?:i)?=))([^#\&\?]*).*/ // For testing. var urls = [ '//www.youtube-nocookie.com/embed/up_lNV-yoK4?rel=0', 'http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo', 'http://www.youtube.com/watch?v=cKZDdG9FTKY&feature=channel', 'http://www.youtube.com/watch?v=yZ-K7nCVnBI&playnext_from=TL&videos=osPknwzXEas&feature=sub', 'http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I', 'http://www.youtube.com/user/SilkRoadTheatre#p/a/u/2/6dwqZw0j_jY', 'http://youtu.be/6dwqZw0j_jY', 'http://www.youtube.com/watch?v=6dwqZw0j_jY&feature=youtu.be', 'http://youtu.be/afa-5HQHiAs', 'http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo?rel=0', 'http://www.youtube.com/watch?v=cKZDdG9FTKY&feature=channel', 'http://www.youtube.com/watch?v=yZ-K7nCVnBI&playnext_from=TL&videos=osPknwzXEas&feature=sub', 'http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I', 'http://www.youtube.com/embed/nas1rJpm7wY?rel=0', 'http://www.youtube.com/watch?v=peFZbP64dsU', 'http://youtube.com/v/dQw4w9WgXcQ?feature=youtube_gdata_player', 'http://youtube.com/vi/dQw4w9WgXcQ?feature=youtube_gdata_player', 'http://youtube.com/?v=dQw4w9WgXcQ&feature=youtube_gdata_player', 'http://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player', 'http://youtube.com/?vi=dQw4w9WgXcQ&feature=youtube_gdata_player', 'http://youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player', 'http://youtube.com/watch?vi=dQw4w9WgXcQ&feature=youtube_gdata_player', 'http://youtu.be/dQw4w9WgXcQ?feature=youtube_gdata_player' ]; var i, r, rx = /^.*(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/)|(?:(?:watch)?\?v(?:i)?=|\&v(?:i)?=))([^#\&\?]*).*/; for (i = 0; i < urls.length; ++i) { r = urls[i].match(rx); console.log(r[1]); } 

我创build了一个函数,用于testing用户对Youtube,Soundcloud或VimeoembeddedID的input,以便能够使用embedded式媒体创build更持续的devise。 此函数检测并返回具有两个属性的对象:“type”和“id”。 types可以是“youtube”,“vimeo”或“soundcloud”,“id”属性是唯一的媒体ID。

在网站上,我使用了一个textarea转储,用户可以粘贴任何types的链接或embedded代码,包括vimeo和youtube的iFrameembedded。

 function testUrlForMedia(pastedData) { var success = false; var media = {}; if (pastedData.match('http://(www.)?youtube|youtu\.be')) { if (pastedData.match('embed')) { youtube_id = pastedData.split(/embed\//)[1].split('"')[0]; } else { youtube_id = pastedData.split(/v\/|v=|youtu\.be\//)[1].split(/[?&]/)[0]; } media.type = "youtube"; media.id = youtube_id; success = true; } else if (pastedData.match('http://(player.)?vimeo\.com')) { vimeo_id = pastedData.split(/video\/|http:\/\/vimeo\.com\//)[1].split(/[?&]/)[0]; media.type = "vimeo"; media.id = vimeo_id; success = true; } else if (pastedData.match('http://player\.soundcloud\.com')) { soundcloud_url = unescape(pastedData.split(/value="/)[1].split(/["]/)[0]); soundcloud_id = soundcloud_url.split(/tracks\//)[1].split(/[&"]/)[0]; media.type = "soundcloud"; media.id = soundcloud_id; success = true; } if (success) { return media; } else { alert("No valid media id detected"); } return false; } 

鉴于YouTube有各种url样式,我认为正则expression式是一个更好的解决scheme。 这是我的正则expression式:

 ^.*(youtu.be\/|v\/|embed\/|watch\?|youtube.com\/user\/[^#]*#([^\/]*?\/)*)\??v?=?([^#\&\?]*).* 

第3组有您的YouTube ID

示例YouTubeurl(目前包括“传统embeddedurl样式”) – 上述正则expression式适用于所有这些:

 http://www.youtube.com/v/0zM3nApSvMg?fs=1&amp;hl=en_US&amp;rel=0 http://www.youtube.com/embed/0zM3nApSvMg?rel=0 http://www.youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index http://www.youtube.com/watch?v=0zM3nApSvMg http://youtu.be/0zM3nApSvMg http://www.youtube.com/watch?v=0zM3nApSvMg#t=0m10s http://www.youtube.com/user/IngridMichaelsonVEVO#p/a/u/1/QdK8U-VIH_o 

帽子提示Lasnv

Java代码:(适用于所有的URL:

  1. http://www.youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index
  2. http://www.youtube.com/user/IngridMichaelsonVEVO#p/a/u/1/QdK8U-VIH_o
  3. http://youtube.googleapis.com/v/0zM3nApSvMg?fs=1&hl=en_US&rel=0
  4. http://www.youtube.com/watch?v=0zM3nApSvMg#t=0m10s
  5. http://www.youtube.com/embed/0zM3nApSvMg?rel=0
  6. http://www.youtube.com/watch?v=0zM3nApSvMg
  7. http://youtu.be/0zM3nApSvMg
  8. http://www.youtube.com/watch?v=0zM3nApSvMg/
  9. http://www.youtube.com/watch?feature=player_detailpage&v=8UVNT4wvIGY

  String url = "http://www.youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index"; String regExp = "/.*(?:youtu.be\\/|v\\/|u/\\w/|embed\\/|watch\\?.*&?v=)"; Pattern compiledPattern = Pattern.compile(regExp); Matcher matcher = compiledPattern.matcher(url); if(matcher.find()){ int start = matcher.end(); System.out.println("ID : " + url.substring(start, start+11)); } 

对于DailyMotion:

 String url = "http://www.dailymotion.com/video/x4xvnz_the-funny-crash-compilation_fun"; String regExp = "/video/([^_]+)/?"; Pattern compiledPattern = Pattern.compile(regExp); Matcher matcher = compiledPattern.matcher(url); if(matcher.find()){ String match = matcher.group(); System.out.println("ID : " + match.substring(match.lastIndexOf("/")+1)); } 

由于YouTube的videoID被设置为11个字符 ,我们可以简单地只是在用v=分割url之后的substring 。 那末我们就不依赖于&符号了。

 var sampleUrl = "http://www.youtube.com/watch?v=JcjoGn6FLwI&asdasd"; var video_id = sampleUrl.split("v=")[1].substring(0, 11) 

好而简单:)

我总结了所有的build议,这里是对这个问题的普遍和简短的回答:

 if(url.match('http://(www.)?youtube|youtu\.be')){ youtube_id=url.split(/v\/|v=|youtu\.be\//)[1].split(/[?&]/)[0]; } 

稍微严格的版本:

 ^https?://(?:www\.)?youtu(?:\.be|be\.com)/(?:\S+/)?(?:[^\s/]*(?:\?|&)vi?=)?([^#?&]+) 

testing:

 http://www.youtube.com/user/dreamtheater#p/u/1/oTJRivZTMLs https://youtu.be/oTJRivZTMLs?list=PLToa5JuFMsXTNkrLJbRlB--76IAOjRM9b http://www.youtube.com/watch?v=oTJRivZTMLs&feature=youtu.be https://youtu.be/oTJRivZTMLs http://youtu.be/oTJRivZTMLs&feature=channel http://www.youtube.com/ytscreeningroom?v=oTJRivZTMLs http://www.youtube.com/embed/oTJRivZTMLs?rel=0 http://youtube.com/v/oTJRivZTMLs&feature=channel http://youtube.com/v/oTJRivZTMLs&feature=channel http://youtube.com/vi/oTJRivZTMLs&feature=channel http://youtube.com/?v=oTJRivZTMLs&feature=channel http://youtube.com/?feature=channel&v=oTJRivZTMLs http://youtube.com/?vi=oTJRivZTMLs&feature=channel http://youtube.com/watch?v=oTJRivZTMLs&feature=channel http://youtube.com/watch?vi=oTJRivZTMLs&feature=channel 

从一个mantish发布略有变化的版本:

 var regExp = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]{11,11}).*/; var match = url.match(regExp); if (match) if (match.length >= 2) return match[2]; // error 

这假设代码总是11个字符。 我在ActionScript中使用这个,不知道Javascript是否支持{11,11}。 还增加了对&v = …的支持(以防万一)

多一个:

 var id = url.match(/(^|=|\/)([0-9A-Za-z_-]{11})(\/|&|$|\?|#)/)[2] 

它适用于此线程中显示的任何URL。

当YouTube添加11个base64字符的其他参数时,它将不起作用。 直到那么简单的方法。

我喜欢苏里亚的答案..只是一个情况下,它不会工作…

 String regExp = "/.*(?:youtu.be\\/|v\\/|u/\\w/|embed\\/|watch\\?.*&?v=)"; 

不适用于

 youtu.be/i4fjHzCXg6c and www.youtu.be/i4fjHzCXg6c 

更新版本:

 String regExp = "/?.*(?:youtu.be\\/|v\\/|u/\\w/|embed\\/|watch\\?.*&?v=)"; 

适用于所有人。

试试这个 –

 function getYouTubeIdFromURL($url) { $pattern = '/(?:youtube.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu.be/)([^"&?/ ]{11})/i'; preg_match($pattern, $url, $matches); return isset($matches[1]) ? $matches[1] : false; } 

Chris Nolet更清晰的Lasnv答案的例子是非常好的,但是我最近发现,如果你试图在文本中find你的youtube链接,并在youtube url之后放置一些随机文本,则正则expression式匹配的方式多于需要。 改进的Chris Nolet回答:

 /^.*(?:youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=)([^#\&\?]{11,11}).*/ 
 function parser(url){ var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\/)|(\?v=|\&v=))([^#\&\?]*).*/; var match = url.match(regExp); if (match && match[8].length==11){ alert('OK'); }else{ alert('BAD'); } } 

为了testing:

 https://www.youtube.com/embed/vDoO_bNw7fc - attention first symbol «v» in «vDoO_bNw7fc» http://www.youtube.com/user/dreamtheater#p/u/1/oTJRivZTMLs https://youtu.be/oTJRivZTMLs?list=PLToa5JuFMsXTNkrLJbRlB--76IAOjRM9b http://www.youtube.com/watch?v=oTJRivZTMLs&feature=youtu.be https://youtu.be/oTJRivZTMLs http://youtu.be/oTJRivZTMLs&feature=channel http://www.youtube.com/ytscreeningroom?v=oTJRivZTMLs http://www.youtube.com/embed/oTJRivZTMLs?rel=0 http://youtube.com/v/oTJRivZTMLs&feature=channel http://youtube.com/v/oTJRivZTMLs&feature=channel http://youtube.com/vi/oTJRivZTMLs&feature=channel http://youtube.com/?v=oTJRivZTMLs&feature=channel http://youtube.com/?feature=channel&v=oTJRivZTMLs http://youtube.com/?vi=oTJRivZTMLs&feature=channel http://youtube.com/watch?v=oTJRivZTMLs&feature=channel http://youtube.com/watch?vi=oTJRivZTMLs&feature=channel 

这肯定需要正则expression式:

复制到Ruby IRB:

 var url = "http://www.youtube.com/watch?v=NLqASIXrVbY" var VID_REGEX = /(?:youtube(?:-nocookie)?\.com\/(?:[^\/\n\s]+\/\S+\/|(?:v|e(?:mbed)?)\/|\S*?[?&]v=)|youtu\.be\/)([a-zA-Z0-9_-]{11})/ url.match(VID_REGEX)[1] 

查看所有testing用例: https : //gist.github.com/blairanderson/b264a15a8faaac9c6318

那么,简单parsing的方法就是:在first = sign之后开始第一个 sign。

我认为他们在这里有一个类似的答案:

使用JavaScriptparsingVimeo ID?

 videoId = videoUrl.split('v=')[1].substring(0,11); 

我们知道这些字符“?v =”永远不会出现多于一个,但是“v”可以以某种方式出现在Id本身中,因此我们使用“?v =”作为分隔符。 看到它在这里工作

 //Get YouTube video Id From Its Url $('button').bind('click',function(){ var url='http://www.youtube.com/watch?v=u8nQa1cJyX8', videoId = url.split('?v='),//Split data to two YouTubeVideoId=videoId[1]; alert(YouTubeVideoId);return false; }); <button>Click ToGet VideoId</button> 

简单的正则expression式,如果你有完整的URL,保持简单。

 results = url.match("v=([a-zA-Z0-9]+)&?") videoId = results[1] // watch you need. 
 var video_url = document.getElementById('youtubediv').value; if(video_url!=""){ ytid(video_url); document.getElementById("youtube").setAttribute("src","http://www.youtube.com/embed/"+ytid(video_url)); } function ytid(video_url){ var video_id = video_url.split('v=')[1]; var ampersandPosition = video_id.indexOf('&'); if(ampersandPosition != -1) { video_id = video_id.substring(0, ampersandPosition); } return video_id; } 

我希望它可以帮助

 function youtube_parser(url){ var match = url.match(/^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/); return (match&&match[7].length==11)?match[7]:false; } 

最短,最有效

正如在评论中提到的webstrap:

如果video是以“v”开始的,而且是从youtu.be开始的

正则expression式包含一个小bug \??v?=? 这应该只是在观看部分,否则你会过滤一个'v'如果ID开始与'v' 。 所以这应该做的伎俩

/^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\??v?=?))([^#\&\?]*).*/

我对mantish的正则expression式做了一些小的修改,包括JW's的所有testing用例和matx的答案。 因为它最初并不适用于所有人。 可能还需要做进一步的修改,但据我所知,至less可以覆盖大部分的链接:

/(?:[?&]vi?=|\/embed\/|\/\d\d?\/|\/vi?\/|https?:\/\/(?:www\.)?youtu\.be\/)([^&\n?#]+)/

 var url = ''; // get it from somewhere var youtubeRegExp = /(?:[?&]vi?=|\/embed\/|\/\d\d?\/|\/vi?\/|https?:\/\/(?:www\.)?youtu\.be\/)([^&\n?#]+)/; var match = url.match( youtubeRegExp ); if( match && match[ 1 ].length == 11 ) { url = match[ 1 ]; } else { // error } 

进一步testing:

http://regexr.com/3fp84

在这里比赛迟到了,但是我已经从mantish和jw中得到了两个很好的回应。 首先,修改后的正则expression式:

 const youtube_regex = /^.*(youtu\.be\/|vi?\/|u\/\w\/|embed\/|\?vi?=|\&vi?=)([^#\&\?]*).*/ 

这里是testing代码(我把mantish的原始testing用例添加到jw的更糟糕的testing用例中):

  var urls = [ 'http://www.youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index', 'http://www.youtube.com/user/IngridMichaelsonVEVO#p/a/u/1/QdK8U-VIH_o', 'http://www.youtube.com/v/0zM3nApSvMg?fs=1&amp;hl=en_US&amp;rel=0', 'http://www.youtube.com/watch?v=0zM3nApSvMg#t=0m10s', 'http://www.youtube.com/embed/0zM3nApSvMg?rel=0', 'http://www.youtube.com/watch?v=0zM3nApSvMg', 'http://youtu.be/0zM3nApSvMg', '//www.youtube-nocookie.com/embed/up_lNV-yoK4?rel=0', 'http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo', 'http://www.youtube.com/watch?v=cKZDdG9FTKY&feature=channel', 'http://www.youtube.com/watch?v=yZ-K7nCVnBI&playnext_from=TL&videos=osPknwzXEas&feature=sub', 'http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I', 'http://www.youtube.com/user/SilkRoadTheatre#p/a/u/2/6dwqZw0j_jY', 'http://youtu.be/6dwqZw0j_jY', 'http://www.youtube.com/watch?v=6dwqZw0j_jY&feature=youtu.be', 'http://youtu.be/afa-5HQHiAs', 'http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo?rel=0', 'http://www.youtube.com/watch?v=cKZDdG9FTKY&feature=channel', 'http://www.youtube.com/watch?v=yZ-K7nCVnBI&playnext_from=TL&videos=osPknwzXEas&feature=sub', 'http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I', 'http://www.youtube.com/embed/nas1rJpm7wY?rel=0', 'http://www.youtube.com/watch?v=peFZbP64dsU', 'http://youtube.com/v/dQw4w9WgXcQ?feature=youtube_gdata_player', 'http://youtube.com/vi/dQw4w9WgXcQ?feature=youtube_gdata_player', 'http://youtube.com/?v=dQw4w9WgXcQ&feature=youtube_gdata_player', 'http://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player', 'http://youtube.com/?vi=dQw4w9WgXcQ&feature=youtube_gdata_player', 'http://youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player', 'http://youtube.com/watch?vi=dQw4w9WgXcQ&feature=youtube_gdata_player', 'http://youtu.be/dQw4w9WgXcQ?feature=youtube_gdata_player' ]; var failures = 0; urls.forEach(url => { const parsed = url.match(youtube_regex); if (parsed && parsed[2]) { console.log(parsed[2]); } else { failures++; console.error(url, parsed); } }); if (failures) { console.error(failures, 'failed'); }