【问题标题】:PHP: How to check whether the URL is Youtube's or vimeo'sPHP:如何检查 URL 是 Youtube 还是 vimeo
【发布时间】:2011-09-30 22:19:00
【问题描述】:

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

谢谢。

【问题讨论】:

  • 你是如何收到它的,并检查它是否有效?
  • 我不喜欢这里发布的任何答案,我更喜欢ping url并分析响应的方法,我想是否可以这样做。

标签: php url youtube vimeo


【解决方案1】:

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

【讨论】:

  • 检查主机部分的子字符串是最好的解决方案。
  • @ScooterDaraf 共有三个选项:www.youtube.comyoutube.comyoutu.be。因此,只需使用 || 检查它们
【解决方案2】:

我最近写了这个函数来做这个,希望它对某人有用:

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

}

【讨论】:

    【解决方案3】:

    正如其他人在 cmets 中指出的那样,这是一个快速而肮脏的解决方案,不能很好地处理边缘情况。如果 url 包含“youtube”(example.com/youtube),它将返回误报。 parse_url() 解决方案 mentioned below 是一个更强大的解决方案。


    Regular expressions 适用于这种类型的事情,但通常strpossubstr 在性能方面更快。查看preg_match() 的 PHP 文档。在示例下方有一个关于这件事的注释。

    这是原型代码:

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

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

    【讨论】:

    • 为什么这个答案比 parse_url 答案好?
    • @Icode4food - strpos 是否适用于任何大小写的字符?即“youtube = YOUTUBE”?
    • 这不应该是公认的答案。对于在 URL 的其他部分包含“youtube”或“vimeo”的 URL,它无法返回“未知”。例如。 "foo.com/youtube/123"
    • 它不会检测短网址
    • 错误答案。尝试输入以下网址stackoverflow.com/questions/27969062/…。这将作为 youtube 链接找到,但不是
    【解决方案4】:

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

    【讨论】:

    • 当您的模式是 URL 片段时,为什么您愿意选择 / 作为分隔符?
    【解决方案5】:

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

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

    【讨论】:

    • 不处理像youtu.be这样的短网址
    【解决方案6】:

    你可以试试我的解决方案:

    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】:

      使用regular expressions。你使用什么语言?

      编辑:注意到您的标签是 php.ini。应该是这样的:

      <?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
      ?>
      

      【讨论】:

        【解决方案8】:

        你可以试试这个

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

        【讨论】:

        • 这听起来很不对劲。如果$videourl 在其他任何地方包含这个怎么办?喜欢this-is-not-youtube.com
        • 它也适用于这种情况。因为它将检查“youtube”在整个字符串中的位置,如果它在字符串中找到单词 youtube,那么它将返回该字符串的位置并返回真实结果。在您的示例中,youtube 单词的位置是 12,即大于 0。因此,它将回显该消息(这是一个 youtube 视频)。你也可以对 vimeo 做同样的事情。
        • 但是 URL this-is-not-youtube.com 不应该返回“这是一个 youtube 视频”,不是吗?
        • 是的,在这种情况下,可以使用 parse_url 函数来获取与它完全匹配的主机名。
        猜你喜欢
        • 2018-12-04
        • 1970-01-01
        • 2018-03-28
        • 1970-01-01
        • 2010-11-24
        • 2019-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多