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

标签 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=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/

相关文章:

javascript - 根据窗口大小浏览器动态设置 div 位置

java - 重复正则表达式

regex - Hbase RegexStringComparator筛选器提供的行比预期的多

javascript - 使用 AJAX 或 iframe 将数据从一个网站插入另一个网站

php - 使用模态和 php 更新

javascript - backbone.js 是否可以使用 json 文件作为只读数据存储?

javascript - Angular 6 : Property 'map' does not exist on type 'Observable<Response>'

javascript - 将base64字符串绑定(bind)到src图像不适用于vue

javascript - 正则表达式排除不排除字符串仅第一个字符

Python - Tkinter - 我希望从 Entry 获取()值以在函数中使用