0

我有以下正则表达式来提取 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 参数前面有&or ?

我尝试了以下但没有奏效

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

2 回答 2

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 中的上述模式(?完整字符串中 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)

于 2013-08-20T14:01:45.920 回答
0

您可以包含一个积极的前瞻,以确保 av= 在手表之前:

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

编辑:还进一步查看您的正则表达式,您的格式错误,因此将匹配 embed/. 使用 or 语句时,您需要用括号将语句分组,否则它不会包含表达式的前面部分,而只匹配它们。您还需要转义特殊字符,例如“。” 因为这被视为任何字符

我已经清理了一点:

/^.*youtu(\.)?be(\.com)?(\/|v\/|u\/\w\/)(embed\/|watch\?(v=|.*(?=v=)))([^#\&\?]+)/
于 2013-08-20T14:01:22.200 回答