PHP:如何检查URL是Youtube还是vimeo

lau*_*kok 12 php youtube url vimeo

如何编写函数来检查提供的URL是youtube还是vimeo?

例如,我将这两个URL存储在数据库中作为字符串,

http://vimeo.com/24456787

http://www.youtube.com/watch?v=rj18UQjPpGA&feature=player_embedded
Run Code Online (Sandbox Code Playgroud)

如果URL是youtube,那么我将重写URL,

http://www.youtube.com/embed/rj18UQjPpGA?rel=0&wmode=transparent
Run Code Online (Sandbox Code Playgroud)

如果URL是vimeo,那么我将重写此URL,

http://vimeo.com/moogaloop.swf?clip_id=24456787
Run Code Online (Sandbox Code Playgroud)

谢谢.

Sto*_*osh 27

使用该parse_url功能将URL拆分,然后进行正常检查

$url = 'http://www.youtube.com/watch?v=rj18UQjPpGA&feature=player_embedded';
$parsed = parse_url($url);
Run Code Online (Sandbox Code Playgroud)

会给你这个数组

array
  'scheme' => string 'http' (length=4)
  'host' => string 'www.youtube.com' (length=15)
  'path' => string '/watch' (length=6)
  'query' => string 'v=rj18UQjPpGA&feature=player_embedded' (length=37)
Run Code Online (Sandbox Code Playgroud)

  • @ScooterDaraf 共有三个选项:`www.youtube.com`、`youtube.com` 和 `youtu.be`。所以只需用**或**`||`检查它们 (3认同)

Ico*_*ood 13

正如其他人在评论中指出的那样,这是一个快速而肮脏的解决方案,不能很好地处理边缘情况.如果网址包含"youtube"(example.com/youtube),则会返回误报.下面提到parse_url()解决方案是一个更强大的解决方案.


正则表达式适用于此类事物,但通常strpossubstr性能更快.查看PHP文档preg_match().在这些例子下面有一个关于这件事的说明.

这是原型代码:

function videoType($url) {
    if (strpos($url, 'youtube') > 0) {
        return 'youtube';
    } elseif (strpos($url, 'vimeo') > 0) {
        return 'vimeo';
    } else {
        return 'unknown';
    }
}
Run Code Online (Sandbox Code Playgroud)

显然返回一个字符串不是最好的主意,但你明白了.替换自己的业务逻辑.

  • 这不应该是公认的答案.对于在URL的其他部分中包含"youtube"或"vimeo"的URL,它无法返回"unknown".例如"http://foo.com/youtube/123" (5认同)

小智 11

令人惊讶的是,没有人提到youtube网址也可以包含域名'youtu.be',在这种情况下,所有上述解决方案都必须进行调整以适应这种可能性.


Amp*_*ign 10

我最近编写了此函数来实现此目的,希望它对某人有用:

    /**
 * [determineVideoUrlType used to determine what kind of url is being submitted here]
 * @param  string $url either a YouTube or Vimeo URL string
 * @return array will return either "youtube","vimeo" or "none" and also the video id from the url
 */

public function determineVideoUrlType($url) {


    $yt_rx = '/^((?:https?:)?\/\/)?((?:www|m)\.)?((?:youtube\.com|youtu.be))(\/(?:[\w\-]+\?v=|embed\/|v\/)?)([\w\-]+)(\S+)?$/';
    $has_match_youtube = preg_match($yt_rx, $url, $yt_matches);


    $vm_rx = '/(https?:\/\/)?(www\.)?(player\.)?vimeo\.com\/([a-z]*\/)*([??0-9]{6,11})[?]?.*/';
    $has_match_vimeo = preg_match($vm_rx, $url, $vm_matches);


    //Then we want the video id which is:
    if($has_match_youtube) {
        $video_id = $yt_matches[5]; 
        $type = 'youtube';
    }
    elseif($has_match_vimeo) {
        $video_id = $vm_matches[5];
        $type = 'vimeo';
    }
    else {
        $video_id = 0;
        $type = 'none';
    }


    $data['video_id'] = $video_id;
    $data['video_type'] = $type;

    return $data;

}
Run Code Online (Sandbox Code Playgroud)