正则表达式提取youtube视频ID?

use*_*637 0 javascript regex uri get

我有以下正则表达式来提取youtube视频ID

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

例如,这将匹配

http://www.youtube.com/watch?v=9bZkp7q19f0&desc=gangnam
Run Code Online (Sandbox Code Playgroud)

但是,有时视频参数不会首先出现,因此下面的内容不匹配.

http://www.youtube.com/watch?desc=gangnam&v=9bZkp7q19f0
Run Code Online (Sandbox Code Playgroud)

如何在正则表达式中包含一个or子句来说明v参数前面带有&?

我试过以下但是没有用

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

Eli*_*gem 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"
Run Code Online (Sandbox Code Playgroud)

你可以(但并不是真的需要)确保只匹配URI中的上述模式(?完整字符串中的a后面的位:

var expr = /\?.*(?:v=)([^&]+)/;
Run Code Online (Sandbox Code Playgroud)

你尝试过的模式充满了缺点,并且开始修复这个过多的工作,我只是忘了它.例如:

/youtu.be/
Run Code Online (Sandbox Code Playgroud)

匹配文字youtu后跟任何字符的一个实例(不是新行)(.),后跟文字be.因此它匹配youtu2be,youtu#be,youtu.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"
Run Code Online (Sandbox Code Playgroud)

就这样.无需检查前一个?要么 &...

它是如何工作的:

  • (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=,并匹配随后的第一个符号直到第一个符号&.如果找不到v=,但是youtu.be/找到了,正则表达式将捕获正斜杠之后的所有内容(即vid id)