基本上,视频 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 中的上述模式(?完整字符串中 a 后面的位:
var expr = /\?.*(?:v=)([^&]+)/;
您尝试过的模式充满了错误,要开始修复它的工作量太大,我会忘记它。例如:
/youtu.be/
匹配一个文字youtu,后跟任何 char 的一个实例(不是换行符) ( .),后跟一个文字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"
就这样。不需要检查前面的 ? 或者 &...
它是如何工作的:
(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)