从Vimeo URL中获取视频ID

32

我试图找到最佳的正则表达式,从URL中获取Vimeo视频ID。

示例网址:

https://vimeo.com/11111111
http://vimeo.com/11111111
https://www.vimeo.com/11111111
http://www.vimeo.com/11111111
https://vimeo.com/channels/11111111
http://vimeo.com/channels/11111111
https://vimeo.com/groups/name/videos/11111111
http://vimeo.com/groups/name/videos/11111111
https://vimeo.com/album/2222222/video/11111111
http://vimeo.com/album/2222222/video/11111111
https://vimeo.com/11111111?param=test
http://vimeo.com/11111111?param=test

我的当前正则表达式不起作用:

/http:\/\/(www\.)?vimeo.com\/(\d+)($|\/)/

游乐场和测试地址: http://jsbin.com/asuqic/1/edit?javascript,live


1
你可以使用 url.split('/').slice(-1)[0].split('?')[0],还是需要用正则表达式? - Yoshi
5个回答

44

更新:我注意到这个答案现在时不时地受到关注(通过投票或评论)。这个答案已经超过两年了,可能支持的URL类型已经不再是最新的。我不会积极维护这个正则表达式 - 它只是作为回答问题的一个答案,并且仅仅考虑了列出的格式。请自行承担使用风险,或者更好地说,将其仅用作开发基于最新和全面的URL格式列表的自己的正则表达式的起点。

请参见@l2aelba的API解决方案:https://dev59.com/2mYr5IYBdhLWcg3w7eXb#37695721


这是完整的正则表达式,它还确保了格式的正确性:

/https?:\/\/(?:www\.|player\.)?vimeo.com\/(?:channels\/(?:\w+\/)?|groups\/([^\/]*)\/videos\/|album\/(\d+)\/video\/|video\/|)(\d+)(?:$|\/|\?)/

现在您可以在捕获组1(如果存在)中检索组名称,在捕获组2(如果存在)中检索专辑ID,以及在捕获组3(始终)中检索视频ID。

演示


1
@l2aelba 抱歉,复制粘贴错误。请将我的答案中的代码复制到演示中。 - Martin Ender
1
@l2aelba,我猜我又在答复中放错了链接:D...不管怎样,现在一切都解决了;) - Martin Ender
我发现一个链接,它是vimeo.com/channels/channelname/video_id(可能是因为这个帖子有点旧),这不在你的结果范围内。我将其更改为/https?://(?:www.)?vimeo.com/(?:channels/\w/|groups/([^/]*)/videos/|album/(\d+)/video/|)(\d+)(?:$|/|?)/;但是,对于"http://www.vimeo.com/11111111",我得到了错误的结果。也许你能立刻看出我做错了什么哈哈。 - Aurelin
@Aurelin,我认为你想要channels\/(?:\w+\/)?以确保在频道名称参数后还有另一个/。我会编辑这篇文章,并最终修复那个错别字。 - Martin Ender
1
@Aurelin 它抑制了捕获 - Martin Ender
显示剩余7条评论

12

自 2016 年以来,@Martin Ender 表示 已不再是最新的


因此这里有一个API解决方案:(无需正则表达式,仅使用 API 调用并保证安全!)

jQuery:

function GetVimeoIDbyUrl(url) {
  var id = false;
  $.ajax({
    url: 'https://vimeo.com/api/oembed.json?url='+url,
    async: false,
    success: function(response) {
      if(response.video_id) {
        id = response.video_id;
      }
    }
  });
  return id;
}

压缩:

function GetVimeoIDbyUrl(e){var i=!1;return $.ajax({url:"https://vimeo.com/api/oembed.json?url="+e,async:!1,success:function(e){e.video_id&&(i=e.video_id)}}),i}

纯/本地JS:(IE9+和现代浏览器)

function GetVimeoIDbyUrl(url) {
  var id = false;
  var request = new XMLHttpRequest();
  request.open('GET', 'https://vimeo.com/api/oembed.json?url='+url , false);
  request.onload = function() {
    if (request.status >= 200 && request.status < 400) {
      var response = JSON.parse(request.responseText);
      if(response.video_id) {
        id = response.video_id;
      }
    }
  };
  request.send();
  return id;
}

压缩:

function GetVimeoIDbyUrl(e){var t=!1,o=new XMLHttpRequest;return o.open("GET","https://vimeo.com/api/oembed.json?url="+e,!1),o.onload=function(){if(o.status>=200&&o.status<400){var e=JSON.parse(o.responseText);e.video_id&&(t=e.video_id)}},o.send(),t}

演示: https://jsbin.com/mevejoxudo/1/edit?js,output

某些类型的网址不支持问号(?): https://vimeo.com/help/contact#tech-api (告诉他们,不要告诉我哈哈:D)


4
var r = /(videos|video|channels|\.com)\/([\d]+)/,
    a = "https://vimeo.com/album/2222222/video/11111111";

console.log(a.match(r)[2]); // 11111111;

http://jsbin.com/asuqic/7/edit


3
以下正则表达式可以返回第1组中的ID,适用于只想检索此信息的人。它适用于问题中提供的所有示例URL。 它也可以在没有http://https://的情况下使用。 它还适用于类似player.vimeo.com/...的URL。
/^.*(?:vimeo.com)\\/(?:channels\\/|groups\\/[^\\/]*\\/videos\\/|album\\/\\d+\\/video\\/|video\\/|)(\\d+)(?:$|\\/|\\?)/

1
这是未转义版本+对http://vimeo.com/channels/channelname/1111111111的支持已添加:`/^.*(?:vimeo.com)\/(?:channels\/|channels\/\w+\/|groups\/[^\/]*\/videos\/|album\/\d+\/video\/|video\/|)(\d+)(?:$|\/|\?)/` - Didier Ghys

0

对于 PHP,以下代码适用于以下 URL:

例如:

http://vimeo.com/88888888
http://player.vimeo.com/video/88888888
http://vimeo.com/channels/staffpicks/88888888
http://vimeo.com/groups/groupsname/88888888

PHP 代码:

    $vimeoUrl = 'http://vimeo.com/channels/channelsName/11111111';
    $fetchVimeoIdArr = explode('/', $vimeoUrl);
    $idCounter = count($fetchVimeoIdArr) - 1;
    $vimeoId = $fetchVimeoIdArr[$idCounter];

2
它将返回:11111111?param = test - Niko Jojo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接