2012-05-07 119 views
20

我试图从vimeo网址获取ID。有没有比这更简单的方法?所有VIMEO视频网址,我看到的总是:从Vimeo网址获取Vimeo id的简单方法

https://vimeo.com/29474908

https://vimeo.com/38648446

// VIMEO 


$vimeo = $_POST['vimeo']; 

function getVimeoInfo($vimeo) 
{ 
    $url = parse_url($vimeo); 
    if($url['host'] !== 'vimeo.com' && 
      $url['host'] !== 'www.vimeo.com') 
     return false; 
    if (preg_match('~^http://(?:www\.)?vimeo\.com/(?:clip:)?(\d+)~', $vimeo, $match)) 
    { 
     $id = $match[1]; 
    } 
    else 
    { 
     $id = substr($link,10,strlen($link)); 
    } 

    if (!function_exists('curl_init')) die('CURL is not installed!'); 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, "http://vimeo.com/api/v2/video/$id.php"); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 10); 
    $output = unserialize(curl_exec($ch)); 
    $output = $output[0]; 
    curl_close($ch); 
    return $output['id']; 
} 

$vimeo_id = getVimeoInfo($vimeo); 

回答

21

我认为使用parse_url()是最好的选择:

$vimeo = 'https://vimeo.com/29474908'; 

echo (int) substr(parse_url($vimeo, PHP_URL_PATH), 1); 
+0

注:这个答案是不再有效,并且不包括与“不公开”隐私模式相关的其他问题。请参阅http://stackoverflow.com/a/34027757/1886079以获取彻底的未来证明解决方案。 – Dashron

33

有很多很多VIMEO网址是有效的。几个例子是

所有有效的URL:

http://vimeo.com/6701902 
http://vimeo.com/670190233 
http://player.vimeo.com/video/67019023 
http://player.vimeo.com/video/6701902 
http://player.vimeo.com/video/67019022?title=0&byline=0&portrait=0 
http://player.vimeo.com/video/6719022?title=0&byline=0&portrait=0 
http://vimeo.com/channels/vimeogirls/6701902 
http://vimeo.com/channels/vimeogirls/67019023 
http://vimeo.com/channels/staffpicks/67019026 
http://vimeo.com/15414122 
http://vimeo.com/channels/vimeogirls/66882931 

全部无效网址:

http://vimeo.com/videoschool 
http://vimeo.com/videoschool/archive/behind_the_scenes 
http://vimeo.com/forums/screening_room 
http://vimeo.com/forums/screening_room/topic:42708 

我写这个Java正则表达式来捕获所有上述有效的URL,并拒绝无效的。我不知道,如果他们vimeo有更多有效的网址。

(https?://)?(www.)?(player.)?vimeo.com/([a-z]*/)*([0-9]{6,11})[?]?.* 

希望这有助于...

+14

为了让PHP的preg_match更加友好,我简单地避开了正斜杠和圆点:'/(https \:\/\ /)?(www \。)?(player \。)?vimeo \ .com \ /( [az] * \ /)*([0-9] {6,11})[?]?。* /'' –

+2

我对这些解决方案进行了回顾,以获得vimeo的id,以及youtube和dailymotion, :https://github.com/lingtalfi/video-ids-and-thumbnails/blob/master/testvideo.php。 – ling

+0

在线示例:https://regex101.com/r/7NAAd0/2 –

1

这应该检索各种VIMEO URL的ID。

$url = 'https://vimeo.com/cool/29474908?title=0&byline=0&portrait=0'; 
$urlParts = explode("/", parse_url($url, PHP_URL_PATH)); 
$videoId = (int)$urlParts[count($urlParts)-1]; 
18

对于那些谁希望看到使用PHP完全实现,我使用user2200660提供,由摩根德莱尼格式化PHP的正则表达式的代码,那就是:

$vimeo = 'http://player.vimeo.com/video/67019023'; 

if(preg_match("/(https?:\/\/)?(www\.)?(player\.)?vimeo\.com\/([a-z]*\/)*([0-9]{6,11})[?]?.*/", $vimeo, $output_array)) { 
    echo "Vimeo ID: $output_array[5]"; 
} 

//outputs: Vimeo ID: 67019023 
+0

注意:此正则表达式不再有效,并且不包含与“未列出”隐私模式相关的其他问题。请参阅https://stackoverflow.com/a/34027757/1886079以获取彻底的未来证明解决方案。 – Dashron

11

[编辑]你现在可以通过API来完成这一切!

如果您通过“链接”参数向搜索终端提供逗号分隔的Vimeo网址列表(https://developer.vimeo.com/api/endpoints/videos#GET/videos),我们会将这些视频作为API响应返回。

例如

GET https://api.vimeo.com/videos?links=https://vimeo.com/74648232,https://vimeo.com/232323497 

[原文]

的Vimeo提供了许多不同类型的视频的URL,其中一些不包括ID的。为了确保所有Vimeo网站的支持,您应该直接向vimeo询问该ID。

您可以通过oEmbed endpoint询问vimeo。

有很多选项,但最简单的选择是对url https://vimeo.com/api/oembed.json?url={vimeo_url}发出HTTP GET请求,用相应的url替换{vimeo_url}

例如,让你上述(https://vimeo.com/29474908)所提供的的ID发出HTTP GET请求,

https://vimeo.com/api/oembed.json?url=https://vimeo.com/29474908

解析JSON响应,并抓住video_id参数。

+0

值得向Vimeo提出额外要求的好的未来证明解决方案。日Thnx! – JurgenR

+0

我们最近发布了解决这个问题的更好方法。检查编辑! – Dashron

1

如果有人需要它在JavaScript基础上@ user2200660答案:

function getVimeoVideoId(url){ 

    var regex = new RegExp(/(https?:\/\/)?(www.)?(player.)?vimeo.com\/([a-z]*\/)*([0-9]{6,11})[?]?.*/); 

    if (regex.test(url)) { 
     return regex.exec(url)[5]; 
    } 
}