PHP:如何检查URL是否为YouTube或Vimeo的

16

我该如何编写一个函数来检查提供的URL是否为YouTube或Vimeo?

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

http://vimeo.com/24456787

http://www.youtube.com/watch?v=rj18UQjPpGA&feature=player_embedded

如果URL是YouTube,那么我会将URL重写为:

http://www.youtube.com/embed/rj18UQjPpGA?rel=0&wmode=transparent

如果URL是vimeo,则我将重写此URL为:

http://vimeo.com/moogaloop.swf?clip_id=24456787
谢谢。

你是如何首先接收它,并检查它是否有效的? - Cole
我不喜欢这里发布的任何答案,我更喜欢一种方法来ping URL并分析响应,如果可以的话。 - Zac
8个回答

32
使用parse_url函数来拆分URL,然后进行正常的检查。
$url = 'http://www.youtube.com/watch?v=rj18UQjPpGA&feature=player_embedded';
$parsed = parse_url($url);

会给你这个数组

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)

1
检查主机部分的子字符串是最佳解决方案。 - Pablo Pazos
5
有三个选项:www.youtube.comyoutube.comyoutu.be。所以只需使用 || 来检查它们即可。 - mertyildiran

21

我最近编写了这个函数来准确地执行这个操作,希望对某些人有用:

    /**
 * [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;

}

16
正如其他评论中所指出的,这是一个快速而不完善的解决方案,无法很好地处理边缘情况。如果URL包含"youtube"(例如example.com/youtube),它将返回一个错误的结果。下面提到的parse_url()解决方案是一个更加健壮的解决方案。
正则表达式对于这种类型的问题很有效,但在性能方面,strpos或substr通常更快。请查看PHP文档中的preg_match()部分。在示例下面,有一个关于这个问题的说明。
以下是原型代码:
function videoType($url) {
    if (strpos($url, 'youtube') > 0) {
        return 'youtube';
    } elseif (strpos($url, 'vimeo') > 0) {
        return 'vimeo';
    } else {
        return 'unknown';
    }
}

显然,返回一个字符串并不是最好的主意,但你明白我的意思。请用你自己的业务逻辑进行替换。

1
为什么这个答案比parse_url答案更好? - mgPePe
@Icode4food - strpos() 函数对字符的任何大小写都有效吗?即 "youtube = YOUTUBE"? - Shackrock
5
这不应该被接受为正确答案。它无法对包含"youtube"或"vimeo"的URL的其他部分返回"unknown",例如:"http://foo.com/youtube/123"。请修改翻译内容并使其更通俗易懂,但不要改变原意。 - nickh
1
它无法检测短网址。 - Mojtaba
答案错误。尝试将以下网址http://stackoverflow.com/questions/27969062/regex-to-find-youtube-link-in-string放入其中。这会将其识别为YouTube链接,但实际上并不是。 - Hashan
在 URL 路径中添加一个点 youtube. 或 vimeo.,以确保它不在其中。例如 mywebsite.com/youtube/my-youtube-videos.html。 - Gino

3
您可以使用preg_match()函数:
$u1="http://vimeo.com/24456787";
$u2="http://www.youtube.com/watch?v=rj18UQjPpGA&feature=player_embedded";

if(preg_match('/http:\/\/(www\.)*vimeo\.com\/.*/',$u1)){
    // do vimeo stuff
    echo "Vimeo URL found!\n";
}

if(preg_match('/http:\/\/(www\.)*youtube\.com\/.*/',$u2)){
    // do youtube stuff
    echo "YouTube URL found!\n";
}

2
为什么你会自愿选择“/”作为定界符,当你的模式是一个URL片段? - John Flatness

3

如果您只想检查字符串是否存在,请使用stripos。如果它不包含youtube.com或vimeo.com,则URL格式错误,对吗?stripos也是不区分大小写的。

if(stripos($url,'youtu')===false){
    //must be vimeo
    } else {
    //is youtube
    }

不支持像 youtu.be 这样的短链接。 - Zac Grierson

1
你可以尝试我的解决方案:
function checkServer( $domains=array(), $url ) {
    foreach ( $domains as $domain ) {
        if ( strpos($url, $domain ) > 0) {
            return true;
        } else {
            return false;
        }
    }
}

使用:

if( checkServer(array("youtube.com","youtu.be"), $url ) ) {
    //is Youtube url
}
elseif( checkServer(array("vimeo.com"), $url ) ) {
    //is Vimeo
}
elseif ( checkServer(array("any domain"), $url ) ) {
    //is Any Domain
}else {
    //unknow domain
}

0

使用正则表达式。你使用的是哪种语言?

编辑:注意到你的标签是PHP。应该是这样的:

<?php
// get host name from URL
preg_match('@^(?:http://)?([^/]+)@i',
    "http://www.youtube.com/index.html", $matches);
$host = $matches[1];

// get last two segments of host name
preg_match('/[^.]+\.[^.]+$/', $host, $matches);
echo {$matches[0]}\n"; //youtube.com
?>

-1
你可以试试这个。
<?php
  if (strpos($videourl, 'youtube') > 0) {
    echo 'This is a youtube video';
  } 
?>

听起来很不对劲。如果$videourl在其他任何地方包含这个,比如 this-is-not-youtube.com会怎么样? - Nico Haase
它在这种情况下也能工作。因为它将检查整个字符串中“youtube”的位置,如果在字符串中找到了单词youtube,则会返回该字符串的位置并返回true结果。在您的示例中,youtube单词的位置是12,即大于0。因此,它将回显该消息(这是一个YouTube视频)。您也可以对vimeo执行相同的操作。 - Deepak
但是URL this-is-not-youtube.com不应该返回"This is a youtube video",对吗? - Nico Haase
是的,在这种情况下,可以使用parse_url函数来获取主机名以精确匹配它。 - Deepak

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