我有以下正则表达式来提取 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
如何在正则表达式中包含 or 子句来说明 v 参数前面是 &
或 ?
?
我尝试了以下方法,但没有成功
var regExp = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\[?$]v=)([^#\&\?]*).*/;
最佳答案
基本上,视频 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/
匹配文字 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"
仅此而已。不需要检查前面的 ?或&...
它是如何工作的:
-
(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)
关于javascript - 正则表达式提取youtube视频id?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18336873/