【问题标题】:Modify regex to allow for additional urls修改正则表达式以允许额外的 url
【发布时间】:2014-09-28 17:48:26
【问题描述】:

我已经用我的正则表达式尝试了一切,但我似乎无法适应我的新 URL,它只是不适合我。

请看我的演示:http://jsfiddle.net/693y7/

基本上我需要从每个 url 中提取视频 ID,并确定它是 youtube 还是视频,它确定它的位置就好了,但是 ID 不适用于所有 url。

我没有写这个正则表达式,但是我尝试添加用户、附加或运算符以尝试找到替代结果,但我只是没有得到任何结果,有人介意帮助我更好地了解如何处理新的在演示中不起作用的网址?

网址:

var urls = [
    "//player.vimeo.com/video/84687115",
    "http://player.vimeo.com/video/25451551",
    "http://www.youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index",
    "http://www.youtube.com/user/usernamehere#p/a/u/1/QdK8U-VIH_o",
    "http://www.youtube.com/v/0zM3nApSvMg?fs=1&hl=en_US&rel=0",
    "http://www.youtube.com/watch?v=0zM3nApSvMg#t=0m10s",
    "http://www.youtube.com/embed/0zM3nApSvMg?rel=0",
    "http://www.youtube.com/watch?v=0zM3nApSvMg",
    "https://youtube.googleapis.com/v/My2FRPA3Gf8",
    "http://youtu.be/0zM3nApSvMg",
    "http://vimeo.com/84687115",
    "http://vimeo.com/channels//84687115",
    "http://vimeo.com/groups//videos/84687115"
];

这是我用来匹配 ID 的函数

function parseVideo(url) {

    url.match(/(http:|https:|)\/\/(player.|www.)?(vimeo\.com|youtu(be\.com|\.be|be\.googleapis\.com))\/(video\/|embed\/|watch\?v=|v\/|user\/)?([A-Za-z0-9._%-]*)(\&\S+)?/);

    if (RegExp.$3.indexOf('youtu') > -1) {
        var type = 'youtube';
    } else if (RegExp.$3.indexOf('vimeo') > -1) {
        var type = 'vimeo';
    }

    return {
        type: type,
        id: RegExp.$6
    };
}

我希望这是足够的信息!

【问题讨论】:

  • 您需要扩展 url 中间的匹配器以允许“channels//”和“groups//”作为有效值jsfiddle.net/693y7/1
  • 谢谢@LJ_1102 除了用户在其中的 url 之外的所有内容(数组中的第 4 个 url)
  • rubular.com 是调试正则表达式的好工具,不仅适用于 ruby​​ 正则表达式
  • 我还可以向您介绍一种更简单的方法吗? jsfiddle.net/693y7/2
  • 哇@LJ_1102 非常非常简洁优雅!

标签: javascript jquery regex youtube vimeo


【解决方案1】:

您需要在正则表达式中添加channelsgroups,并且您还需要在url中允许多个连续的/

url.match(/(http:|https:|)\/\/(player.|www.)?(vimeo\.com|youtu(be\.com|\.be|be\.googleapis\.com))\/(video\/*|embed\/*|watch\?v=|v\/*|user\/*|channels\/*|groups\/*)?([A-Za-z0-9._%-]*)(\&\S+)?/);

【讨论】:

    【解决方案2】:

    我认为您最好使用多个正则表达式。事实上,我可能会进行设置,以便您对每种预期格式都有一个正则表达式,它可以做两件事:1)明确将其标识为某种格式,以及 2)在所需部分周围放置一个匹配组。如果你把它们都放在一个数组中,你可以编写一些代码循环遍历它们,并在找到第一个匹配时停止。

    patterns = [ ... ] // all your different regexes
    for (regex in patterns) {
        if (url.match(regex)) {
            // Grab the variables you need and return them.
        }
    }
    

    【讨论】:

      【解决方案3】:

      您需要扩展 url 中间的匹配器以允许 “channels//”和“groups//”作为有效值 jsfiddle.net/693y7/1

      /(http:|https:|)\/\/(player.|www.)?(vimeo\.com|youtu(be\.com|\.be|be\.googleapis\.com))\/(video\/|embed\/|watch\?v=|v\/|user\/|channels\/\/|groups\/\/videos\/)?([A-Za-z0-9._%-]*)(\&\S+)?/
      

      正如您所指出的,这仍然不适用于您示例中的第四个 URL。 为了也支持这个 url,你需要添加一个额外的匹配组匹配“a/u/1”,或者在正则表达式中

      (\/a\/u\/\d)?
      

      正如我在 cmets 中指出的那样,使用非正则表达式方法可能更简单, 假设视频 ID 始终位于 url 的末尾,仅后跟一些元参数,可以使用以下方法 http://jsfiddle.net/693y7/2/

      var sres = url.split("/");
      var dirtyid = sres[sres.length-1];
      return dirtyid.replace("watch?v=", "").split(/&|#|\?/)[0];
      

      这种方法只是将 url 用斜杠分割,然后取出包含 videoid 和 meta 参数的最后一部分,并使用一些简单的替换和分割操作来获得想要的视频 id。

      虽然这种方法可能不是最干净的,但它易于扩展和调整以适应新的用例、url 类型,并且可能比如此大的正则表达式更健壮。

      要获得服务类型,可以简单地对“youtu”和/或“vimeo”进行 indexof 检查。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多