基本上,视频 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)