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

发布于 2024-11-18 19:02:54 字数 466 浏览 7 评论 0原文

如何编写一个函数来检查提供的 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

谢谢。

How can I write a function to check whether the provided URLs is youtube or vimeo?

For instance, I have this two URLs that I store in a database as strings,

http://vimeo.com/24456787

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

If the URL is youtube then I will rewrite the URL to,

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

If the URL is vimeo then I will rewrite this URL to,

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

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

最冷一天 2024-11-25 19:02:54

使用 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)

Use the parse_url function to split the URL up and then just do your normal checks

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

Will give you this array

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)
小嗲 2024-11-25 19:02:54

我最近编写了这个函数来完成此任务,希望它对某人有用:

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

}

I recently wrote this function to do exactly this, hopefully it's useful to someone:

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

}
套路撩心 2024-11-25 19:02:54

正如其他人在评论中指出的那样,这是一个快速而肮脏的解决方案,不能很好地处理边缘情况。如果网址包含“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';
    }
}

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

As others have noted in the comments, this is a quick and dirty solution that does not handle edge cases well. If the url contains "youtube"(example.com/youtube) it will return a false positive. The parse_url() solution mentioned below is a much more robust solution.

Regular expressions work well for this type of thing, but often strpos or substr are faster performance wise. Check out the PHP documentation for preg_match(). Below the examples there is a note for exactly this thing.

Here is prototype code:

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

Obviously returning a string isn't the best idea, but you get the point. Substitute your own business logic.

情话已封尘 2024-11-25 19:02:54

您可以使用 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";
}

You can use 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";
}
倥絔 2024-11-25 19:02:54

由于您要做的只是检查字符串是否存在,因此请使用 stripos。如果其中没有 youtube.com 或 vimeo.com,则该网址格式错误,对吗? stripos 也不区分大小写。

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

Since all you want to do is check for the presence of a string, use stripos. If it doesn't have youtube.com or vimeo.com in it, the url is malformed, right? stripos is case insensitive, too.

if(stripos($url,'youtu')===false){
    //must be vimeo
    } else {
    //is youtube
    }
顾北清歌寒 2024-11-25 19:02:54

您可以尝试我的解决方案:

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
}

You can try my solution:

function checkServer( $domains=array(), $url ) {
    foreach ( $domains as $domain ) {
        if ( strpos($url, $domain ) > 0) {
            return true;
        } else {
            return false;
        }
    }
}

Use:

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
}
<逆流佳人身旁 2024-11-25 19:02:54

使用正则表达式。您使用什么语言?

编辑:注意到你的标签是 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
?>

Use regular expressions. What language are you using?

Edit: noticed your tag was php. It would be something like this:

<?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
?>
酒中人 2024-11-25 19:02:54

你可以试试这个

<?php
  if (strpos($videourl, 'youtube') > 0) {
    echo 'This is a youtube video';
  } 
?>

You can try this

<?php
  if (strpos($videourl, 'youtube') > 0) {
    echo 'This is a youtube video';
  } 
?>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文