Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 正则表达式提取youtube视频id?_Javascript_Regex_Get_Uri - Fatal编程技术网

Javascript 正则表达式提取youtube视频id?

Javascript 正则表达式提取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

我有以下正则表达式来提取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=)([^#\&\?]*).*/;

您可以包含一个积极的前瞻,以确保手表前面有一个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/
匹配一个literal
youtu
,后跟任何字符的一个实例(不是新行)(
),后跟literal
be
。因此它匹配
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/
匹配一个literal
youtu
,后跟任何字符的一个实例(不是新行)(
),后跟literal
be
。因此它匹配
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\
try
watch\.*([^&])([^&])
,处理前置放大器和问号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 of
watch\?
try
watch\?。([^&]+)
,处理前置放大器和问号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=
,这使得开头
[
是一个文本,而不是一个字符类分隔符