【问题标题】:regex to extract youtube video id? [duplicate]正则表达式提取 youtube 视频 ID? [复制]
【发布时间】:2013-08-20 13:54:03
【问题描述】:

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

【问题讨论】:

    标签: javascript regex get uri


    【解决方案1】:

    基本上,视频 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。因此它匹配youtu2beyoutu#beyoutu.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=):匹配 either 文字 youtu.be/either ?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)

    【讨论】:

    • @user784637:是的,但我是说你在做太多的工作。我添加了一个替代的、更短的正则表达式来做同样的事情......为什么不使用它呢?但无论如何,而不是 watch\? 尝试 watch\?.*(?:v=)([^&]+),它处理领先的放大器和问号
    • @user784637:当然可以:console.log('m.youtube.com/watch?feature=related&v=DMua4iJ_VzM&rl=yes&client=mv-google&gl=MX‌​&guid=&hl=en'.match(/(youtu\.be\/|v=)([^&]+)/)[2]); 为我在控制台中记录 DMua4iJ_VzM
    • @user784637:什么检查在哪里拒绝什么?谁?在哪里?什么时候? (难过)
    • @user784637:我已经更新了我的答案,我唯一要做的更改是|v=),现在是|[?&]v=),完整的正则表达式是/(youtu\.be\/|[?&]v=)([^&]+)/
    • @user784637:你没有做同样的事情,你逃脱了[:从你的问题中复制粘贴:\[?$]v=,这使得开头[成为文字,而不是字符-类分隔符
    【解决方案2】:

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

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

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

    我已经清理了一点:

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

    【讨论】:

      猜你喜欢
      • 2011-08-08
      • 1970-01-01
      • 2012-07-11
      • 2012-03-22
      • 2015-11-24
      • 1970-01-01
      • 2015-07-23
      • 2020-12-21
      • 2018-07-08
      相关资源
      最近更新 更多