2012-05-07 153 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]; 
    } 
}