2013-08-20 120 views
0

我有以下的正则表达式来提取YouTube视频ID正则表达式来提取YouTube视频ID?

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

例如,这将匹配

http://www.youtube.com/watch?v=9bZkp7q19f0&desc=gangnam 

但是有时视频参数不放在第一位,因此下面不匹配。

http://www.youtube.com/watch?desc=gangnam&v=9bZkp7q19f0 

如何将包括正则表达式占v参数or子句通过任何一个&?被preceeded?

我尝试以下,但它没有工作

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

回答

5

基本上,视频ID是由v=之前,并随后所述字符串的末尾,或&。所以,你要寻找的正则表达式很简单:

var expr = /(?:v=)([^&]+)/; 
console.log('http://www.youtube.com/watch?v=9bZkp7q19f0&desc=gangnam'.match(expr)[1]); 
//logs "9bZkp7q19f0" 
console.log('http://www.youtube.com/watch?desc=gangnam&v=9bZkp7q19f0'.match(expr)[1]); 
//logs "9bZkp7q19f0" 

你可以(但它不是真正需要的),请务必只在满弦遵循一个?的URI(位符合上述模式:

var expr = /\?.*(?:v=)([^&]+)/; 

你试过被充满了故障,并开始固定,这只是工作太多了,我只是忘记它例如模式:

/youtu.be/ 

匹配人iteral youtu后跟的任意一个字符(不是新行).),后面跟着字面be。因此,它匹配youtu2beyoutu#beyoutu.be,甚至youtu be

在回答您的评论:

expr = /(youtu\.be\/|[?&]v=)([^&]+)/; 
console.log('http://www.youtu.be/9bZkp7q19f0'.match(expr)[2]); 
//logs "9bZkp7q19f0" 
console.log('http://www.youtube.com/watch?desc=gangnam&v=9bZkp7q19f0'.match(expr)[2]); 
//logs "9bZkp7q19f0" 
console.log('http://youtu.be/9bZkp7q19f0'.match(/(youtu\.be\/|v=)([^&]+)/)[2]); 
//logs "9bZkp7q19f0" 
console.log(' youtube.com/watch?argv=xyz&v=u8nQa1cJyX8'.match(/(youtu\.be\/|[?&]v=)([^&]+)/)[2]); 
//logs "u8nQa1cJyX8" 

这就是全部。不需要检查前面的内容吗?或& ...

它是如何工作:

  • (youtu\.be\/|[?&]v=):匹配要么文字youtu.be/要么?v=&v=
  • ([^&]+):遵循以前的比赛,除了&
  • 比赛(和组)的一切

这意味着那youtu.be/<thiswillmatch>&<this will not match>youtube.com/foo/bar/watch?some=params&v=<this will match>&<this won't>。不要紧,如果?后或符号后v=位是直接,这一切正则表达式是感兴趣的是发现v=,并匹配everythign跟随,直到后面的第一个&。如果找不到v=,但找到youtu.be/,则正则表达式将捕获正斜杠后的所有内容(即vid id)

+0

这对于像这样的url不起作用http://youtu.be/9bZkp7q19f0',你可以请建议我如何改变现有的正则表达式部分'?v ='来说明'v'前面带有&符号的情况吗? – user784637

+0

我问了一个非常具体的问题,即正确的语法是如何改变正则表达式的部分'?v ='来解释和符号。我敢肯定,这个改变大约需要2个字符。你知道正确的语法是什么吗? – user784637

+1

@ user784637:是的,但我说你正在做很多工作。我已经添加了一个替代方法,更短的正则表达式,做同样的事情...为什么不使用它?但无论如何,'watch \?'尝试'观看\?。*(?: v =)([^&] +)',处理主要放大器和问号 –

0

可以incude积极前瞻,以确保有AV =领先的腕表:

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

编辑:也进一步展望你的正则表达式格式错误,因此会匹配嵌入/。在使用或语句时,您需要使用方括号将语句分组,或者不会包含表达式的前几部分,只需匹配它们即可。您还需要转义特殊字符,如'。'因为这被视为

我已经清理它一点点的任何字符:

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