如何从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&hl=en_US&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]); }
/^.*(youtu.be\/|v\/|e\/|u\/\w+\/|embed\/|v=)([^#\&\?]*).*/
testing:
- http://www.youtube.com/v/0zM3nApSvMg?fs=1&hl=en_US&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/KdwsulMb8EQ
- http://youtu.be/dQw4w9WgXcQ
- http://www.youtube.com/embed/dQw4w9WgXcQ
- http://www.youtube.com/v/dQw4w9WgXcQ
- http://www.youtube.com/e/dQw4w9WgXcQ
- http://www.youtube.com/watch?v=dQw4w9WgXcQ
- http://www.youtube.com/?v=dQw4w9WgXcQ
- http://www.youtube.com/watch?feature=player_embedded&v=dQw4w9WgXcQ
- http://www.youtube.com/?feature=player_embedded&v=dQw4w9WgXcQ
- http://www.youtube.com/user/IngridMichaelsonVEVO#p/u/11/KdwsulMb8EQ
- http://www.youtube-nocookie.com/v/6L3ZvIMwZFM?version=3&hl=en_US&rel=0
受到这个其他答案的启发。
我创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&hl=en_US&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:
- 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://youtube.googleapis.com/v/0zM3nApSvMg?fs=1&hl=en_US&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
- http://www.youtube.com/watch?v=0zM3nApSvMg/
- 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:
在这里比赛迟到了,但是我已经从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&hl=en_US&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'); }