Javascript 正则表达式提取youtube视频id?
我有以下正则表达式来提取youtube视频idJavascript 正则表达式提取youtube视频id?,javascript,regex,get,uri,Javascript,Regex,Get,Uri,我有以下正则表达式来提取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=9bZ
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=)([^#\&\?]*).*/;
您可以包含一个积极的前瞻,以确保手表前面有一个v=值:
^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?(v=|.*(?=v=)))([^#\&\?]*).*
编辑:进一步查看您的正则表达式,您的正则表达式格式错误,因此将匹配嵌入/。使用or语句时,您需要将语句用括号分组,否则它不会包含表达式的前面部分,只需单独匹配它们即可。您还需要转义特殊字符,如“.”,因为它被视为任何字符
我已经清理了一点:
/^.*youtu(\.)?be(\.com)?(\/|v\/|u\/\w\/)(embed\/|watch\?(v=|.*(?=v=)))([^#\&\?]+)/
您可以包含一个积极的前瞻,以确保手表前面有一个v=值:
^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?(v=|.*(?=v=)))([^#\&\?]*).*
编辑:进一步查看您的正则表达式,您的正则表达式格式错误,因此将匹配嵌入/。使用or语句时,您需要将语句用括号分组,否则它不会包含表达式的前面部分,只需单独匹配它们即可。您还需要转义特殊字符,如“.”,因为它被视为任何字符
我已经清理了一点:
/^.*youtu(\.)?be(\.com)?(\/|v\/|u\/\w\/)(embed\/|watch\?(v=|.*(?=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/
匹配一个literalyoutu
,后跟任何字符的一个实例(不是新行)(
),后跟literalbe
。因此它匹配youtu2be
,youtu\be
,youtu.be
,甚至youtube
针对你的评论:
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/&
和youtube.com/foo/bar/watch?some=params&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/
匹配一个literalyoutu
,后跟任何字符的一个实例(不是新行)(
),后跟literalbe
。因此它匹配youtu2be
,youtu\be
,youtu.be
,甚至youtube
针对你的评论:
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/&
和youtube.com/foo/bar/watch?some=params&v=&@user784637:是的,但我是说你做了太多的工作。我添加了一个替代的、更短的正则表达式,可以做同样的事情…为什么不使用它呢?但无论如何,watch\
trywatch\.*([^&])([^&])
,处理前置放大器和问号alike@user784637:当然可以:console.log('m.youtube.com/watch?feature=related&v=DMua4iJ\u VzM&rl=yes&client=mv google&gl=MX&guid=&hl=en.match(/(youtu\.be\/| v=)([^&]+/)[2]);
控制台中的日志DMua4iJ_VzM
me@user784637:What check where denied What?Who?When?(被难倒)@user784637:我已经更新了我的答案,唯一需要做的更改是|v=)
,现在是|[?&]v=)
,完整的正则表达式是/(youtu\/|[?&]v=)([^&]+)/
@user784637:您没有这样做,您逃过了问题粘贴的副本:\[?$]v=
,这使得开始[
一个文本类,而不是char类delimiter@user784637:是的,但我是说你做了太多的工作。我添加了一个替代方法,缩短了regex,可以做同样的事情…为什么不使用它呢?但是无论如何,intead ofwatch\?
trywatch\?。([^&]+)
,处理前置放大器和问号alike@user784637:当然可以:console.log('m.youtube.com/watch?feature=related&v=DMua4iJ\u VzM&rl=yes&client=mv google&gl=MX&guid=&hl=en.match(/(youtu\.be\/| v=)([^&]+/)[2]);
控制台中的日志DMua4iJ_VzM
me@user784637:What check where denied What?Who?When?(被难倒)@user784637:我已经更新了我的答案,唯一需要做的更改是|v=)
,现在是|[?&]v=)
,完整的正则表达式是/(youtu\/|[?&]v=)([^&]+)/
@user784637:您没有这样做,您逃过了问题粘贴的[
:copy:\[?$]v=
,这使得开头[
是一个文本,而不是一个字符类分隔符