从vimeo url获取Vimeo id的简单方法


Easy way to get Vimeo id from a vimeo url

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

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);

有很多 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 并拒绝无效 URL。我不确定他们是否有更多有效的网址。

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

希望这有帮助...

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

$vimeo = 'https://vimeo.com/29474908';
echo (int) substr(parse_url($vimeo, PHP_URL_PATH), 1);

对于那些想要看到使用 PHP 完全实现的代码的人,我正在使用 user2200660 提供的正则表达式,并由 Morgan Delaney 为 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

[编辑] 您现在可以通过 API 完成所有这些操作!

如果您通过搜索终端节点 (https://developer.vimeo.com/api/endpoints/videos#GET/videos( 的"links"参数提供以逗号分隔的 Vimeo 网址列表,我们将以 API 响应的形式返回这些视频。

例如

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

[原文]

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

您可以通过 oEmbed 端点询问 vimeo。

有很多选择,但最简单的选择是向网址https://vimeo.com/api/oembed.json?url={vimeo_url}发出HTTP GET请求,将{vimeo_url}替换为适当的网址。

例如,要获取您在上面提供的网址的 ID(https://vimeo.com/29474908(,请发出 HTTP GET 请求

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

解析 JSON 响应,并获取video_id参数。

这应该从各种 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];

当前有效的正则表达式:

function getIdFromVimeoURL(url) {
  return /(vimeo(pro)?'.com)'/(?:[^'d]+)?('d+)'??(.*)?$/.exec(url)[3];
}
console.log(getIdFromVimeoURL("https://vimeo.com/channels/staffpicks/272053388"))
console.log(getIdFromVimeoURL("https://vimeo.com/272053388"))
console.log(getIdFromVimeoURL("https://player.vimeo.com/video/272053388"))
// ...etc.

如果有人在 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];
    }
}

这里有很多很好的答案,特别是@user2200660。

https://stackoverflow.com/a/16841070/3850405

但是,前面的答案中不支持的用例是:

https://vimeo.com/showcase/7008490/video/407943692

可以处理它的正则表达式和其他示例:

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

https://regex101.com/r/p2Kldc/1/

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

PHP 中为原始示例代码@zeckdude的功劳。

https://stackoverflow.com/a/29860052/3850405

如果您只需要 Vimeo ID,则可以使用 RegExp 非捕获组:

(?:https?:'/'/)?(?:www'.)?vimeo'.com'/(?:(?:[a-z0-9]*'/)*'/?)?([0-9]+)

在 2022 年,这仍然是 Vimeo 视频的搭配:

https://gist.github.com/anjan011/1fcecdc236594e6d700f

(也在评论中给出的所有错误网址上进行了测试。