如何编写函数来检查提供的URL是youtube还是vimeo?
例如,我将这两个URL存储在数据库中作为字符串
http://vimeo.com/24456787
http://www.youtube.com/watch?v=rj18UQjPpGA&feature=player_embedded
如果网址是youtube,那么我会将网址重写为
http://www.youtube.com/embed/rj18UQjPpGA?rel=0&wmode=transparent
如果网址是vimeo,那么我会将此网址重写为
http://vimeo.com/moogaloop.swf?clip_id=24456787
感谢。
答案 0 :(得分:27)
使用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 :(得分:13)
正如其他人在评论中指出的那样,这是一个快速而肮脏的解决方案,它不能很好地处理边缘情况。如果网址包含“youtube”(example.com/youtube),则会返回误报。 parse_url()
解决方案mentioned below是一个更强大的解决方案。
Regular expressions适用于此类事情,但通常strpos
或substr
表现更快。查看preg_match()
的PHP文档。在这些例子下面有一个关于这件事的说明。
这是原型代码:
function videoType($url) {
if (strpos($url, 'youtube') > 0) {
return 'youtube';
} elseif (strpos($url, 'vimeo') > 0) {
return 'vimeo';
} else {
return 'unknown';
}
}
显然返回一个字符串不是最好的主意,但你明白了。替换你自己的业务逻辑。
答案 2 :(得分:11)
令人惊讶的是,没有人提到youtube网址也可以包含域名'youtu.be',在这种情况下,所有上述解决方案都必须进行调整以适应这种可能性。
答案 3 :(得分:4)
我最近写了这个函数来做到这一点,希望它对某人有用:
/**
* [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;
}
答案 4 :(得分: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";
}
答案 5 :(得分:3)
由于您要做的只是检查是否存在字符串,请使用stripos。如果它中没有youtube.com或vimeo.com,则网址格式错误,对吧? stripos也不区分大小写。
if(stripos($url,'youtu')===false){
//must be vimeo
} else {
//is youtube
}
答案 6 :(得分: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
}
答案 7 :(得分:0)
使用regular expressions。你用的是什么语言?
编辑:注意到你的标签是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
?>