【问题标题】:Youtube I.D parsing for new URL formatsYoutube I.D 解析新 URL 格式
【发布时间】:2011-12-03 08:10:20
【问题描述】:

以前有人问过这个问题,我发现了这个:

Reg exp for youtube link

但我正在寻找一些稍微不同的东西。

我需要匹配与所有可能的 youtube 链接格式兼容的 Youtube I.D 本身。不只是从 youtube.com 开始。

例如:

http://www.youtube.com/watch?v=-wtIMTCHWuI

http://www.youtube.com/v/-wtIMTCHWuI?version=3&autohide=1

http://youtu.be/-wtIMTCHWuI

http://www.youtube.com/oembed?url=http%3A//www.youtube.com/watch?v%3D-wtIMTCHWuI&format=json

http://s.ytimg.com/yt/favicon-wtIMTCHWuI.ico

http://i2.ytimg.com/vi/-wtIMTCHWuI/hqdefault.jpg

我可以使用一个聪明的策略来匹配与所有这些格式兼容的视频 ID -wtIMTCHWuI。我正在考虑字符计数和匹配=?/.& 字符。

【问题讨论】:

  • 您的方法似乎是我会使用的方法。我可能会在 URL 中找到所有“拆分”字符,例如等号、斜杠、& 符号等。然后结果将在一个数组中。从那里我将遍历数组,找出与 YouTube ID 长度相同的字符串。然后,我会通过正则表达式运行它们以剔除所有包含无效字符的字符串。最后,您可以使用 YouTube API 检查该 ID 的视频是否存在(虽然会增加带宽)。
  • 不聪明,但/(\?v=|\/v\/|be\/|v%3d|favicon|vi\/)([a-zA-Z0-9_-]*)/
  • 您可能会发现my answer to a similar question 很有帮助。 (尽管我从未见过您问题中的最后两种语法。(即http://s.ytimg.comhttp://i2.ytimg.com))
  • 谢谢大家,都非常有帮助。我目前正在尝试 parse_url 的组合,剥离无关字符和计数。

标签: php regex youtube format


【解决方案1】:

我不知道这是否是您要查找的内容,但我找到了这个很棒的 YouTube 网址列表 (GitHub)。

列表中的一些 URL 用于代理服务和归因链接。在我的用例中,提供的字符串可以是 URL 也可以只是 ID - 因此正则表达式匹配不会。

因此,基于此处的所有可能性,可以使用两个正则表达式替换来提取 ID:

^.+(\/|vi?=|v%3D)

在所有采样情况下,这会选择字符串开头和 ID 开头之间的所有内容。这是一个演示RegExr

[^a-zA-Z0-9_\-].+$

此外,在所有采样情况下,这会选择从 ID 结尾(在现在截断的字符串中)到字符串结尾的所有内容。 这是一个演示RegExr

【讨论】:

    【解决方案2】:

    有点晚了,但我今天写了这个正则表达式,它不仅识别链接,而且通过匹配组 6 返回 video_id

    ^(https?\:\/\/)?(www\.)?(youtube\.com|youtu\.?be)(\/)?(watch\?v=|\?v=)?(.*)$
    

    https://gist.github.com/Shibizle/3c6707911ea716860786728d31f8e3e5

    测试一下: https://regex101.com/r/l0m7yh/1

    图片:Regex YouTube

    【讨论】:

      【解决方案3】:

      我不得不为我几周前编写的一个 PHP 类处理这个问题,最终得到一个匹配任何类型字符串的正则表达式:有或没有 URL 方案,有或没有子域,youtube.com URL 字符串,youtu .be URL 字符串并处理各种参数排序。您可以查看at GitHub 或直接复制并粘贴下面的代码块:

      /**
       *  Check if input string is a valid YouTube URL
       *  and try to extract the YouTube Video ID from it.
       *  @author  Stephan Schmitz <eyecatchup@gmail.com>
       *  @param   $url   string   The string that shall be checked.
       *  @return  mixed           Returns YouTube Video ID, or (boolean) false.
       */
      function parse_yturl($url)
      {
          $pattern = '#^(?:https?://|//)?(?:www\.|m\.)?(?:youtu\.be/|youtube\.com/(?:embed/|v/|watch\?v=|watch\?.+&v=))([\w-]{11})(?![\w-])#';
          preg_match($pattern, $url, $matches);
          return (isset($matches[1])) ? $matches[1] : false;
      }
      

      测试用例:https://3v4l.org/GEDT0
      JavaScript 版本:https://stackoverflow.com/a/10315969/624466

      为了解释正则表达式,这里有一个拆分版本:

      /**
       *  Check if input string is a valid YouTube URL
       *  and try to extract the YouTube Video ID from it.
       *  @author  Stephan Schmitz <eyecatchup@gmail.com>
       *  @param   $url   string   The string that shall be checked.
       *  @return  mixed           Returns YouTube Video ID, or (boolean) false.
       */
      function parse_yturl($url)
      {
          $pattern = '#^(?:https?://|//)?' # Optional URL scheme. Either http, or https, or protocol-relative.
                   . '(?:www\.|m\.)?'      #  Optional www or m subdomain.
                   . '(?:'                 #  Group host alternatives:
                   .   'youtu\.be/'        #    Either youtu.be,
                   .   '|youtube\.com/'    #    or youtube.com
                   .     '(?:'             #    Group path alternatives:
                   .       'embed/'        #      Either /embed/,
                   .       '|v/'           #      or /v/,
                   .       '|watch\?v='    #      or /watch?v=,
                   .       '|watch\?.+&v=' #      or /watch?other_param&v=
                   .     ')'               #    End path alternatives.
                   . ')'                   #  End host alternatives.
                   . '([\w-]{11})'         # 11 characters (Length of Youtube video ids).
                   . '(?![\w-])#';         # Rejects if overlong id.
          preg_match($pattern, $url, $matches);
          return (isset($matches[1])) ? $matches[1] : false;
      }
      

      【讨论】:

      • 我知道这是一篇旧帖子,但我最近开始需要这个功能,但我有一个问题。您将如何处理带有 m 子域的 URL?
      • @Zach 只需将(?:www\.)? 更改为(?:www|m\.)?。实际操作:3v4l.org/tDBAh
      • @eyecatchUp 我想你的意思是(?:www\.|m\.)? 而不是(?:www\.)? 对吧?
      • 是的,当然。 (笨蛋,不能编辑 2 年前的评论) 这是工作代码:3v4l.org/vaq0iThanks @rineez
      【解决方案4】:

      目前我正在使用这个:

      function _getYoutubeVideoId($url)
      {
        $parts = parse_url($url);
      
        //For seriously malformed urls
        if ($parts === false) {
           return false;
        }
      
        switch ($parts['host']) {
           case 'youtu.be':
              return substr($parts['path'], 1);
              break;
           case 'youtube.com':
           case 'www.youtube.com':
              parse_str($parts['query'], $params);
              return $params['v'];
              break;
           default:
              return false;
              break;
        } 
      }
      

      它可以扩展,但现在它适用于大多数情况

      【讨论】:

      • 我删除了该函数的前缀可见性声明private。 (可能你从一个类中复制了那个,但是为常规函数设置可见性声明是无效的,并且保留给类方法。)
      • @eyecatchUp:是的,你是对的,我从课堂上复制了它。谢谢指正。
      【解决方案5】:

      我找到了这个代码this link:

      <?php 
      /** 
       *  parse_youtube_url() PHP function 
       *  Author: takien 
       *  URL: http://takien.com 
       *  
       *  @param  string  $url    URL to be parsed, eg:  
       *                            http://youtu.be/zc0s358b3Ys,  
       *                            http://www.youtube.com/embed/zc0s358b3Ys
       *                            http://www.youtube.com/watch?v=zc0s358b3Ys 
       *  @param  string  $return what to return 
       *                            - embed, return embed code 
       *                            - thumb, return URL to thumbnail image
       *                            - hqthumb, return URL to high quality thumbnail image.
       *  @param  string     $width  width of embeded video, default 560
       *  @param  string  $height height of embeded video, default 349
       *  @param  string  $rel    whether embeded video to show related video after play or not.
      
       */  
      
       function parse_youtube_url($url,$return='embed',$width='',$height='',$rel=0){ 
          $urls = parse_url($url); 
      
          //expect url is http://youtu.be/abcd, where abcd is video iD
          if($urls['host'] == 'youtu.be'){  
              $id = ltrim($urls['path'],'/'); 
          } 
          //expect  url is http://www.youtube.com/embed/abcd 
          else if(strpos($urls['path'],'embed') == 1){  
              $id = end(explode('/',$urls['path'])); 
          } 
           //expect url is abcd only 
          else if(strpos($url,'/')===false){ 
              $id = $url; 
          } 
          //expect url is http://www.youtube.com/watch?v=abcd 
          else{ 
              parse_str($urls['query']); 
              $id = $v; 
          } 
          //return embed iframe 
          if($return == 'embed'){ 
              return '<iframe width="'.($width?$width:560).'" height="'.($height?$height:349).'" src="http://www.youtube.com/embed/'.$id.'?rel='.$rel.'" frameborder="0" allowfullscreen>'; 
          } 
          //return normal thumb 
          else if($return == 'thumb'){ 
              return 'http://i1.ytimg.com/vi/'.$id.'/default.jpg'; 
          } 
          //return hqthumb 
          else if($return == 'hqthumb'){ 
              return 'http://i1.ytimg.com/vi/'.$id.'/hqdefault.jpg'; 
          } 
          // else return id 
          else{ 
              return $id; 
          } 
      } 
      ?>
      

      我也在处理这个问题,所以如果您找到更好的解决方案,请告诉我。对于开箱即用的图像,它并不能完全满足您的需求,但它可以很容易地适应。

      【讨论】:

        猜你喜欢
        • 2018-08-30
        • 1970-01-01
        • 2011-05-29
        • 2019-01-11
        • 1970-01-01
        • 1970-01-01
        • 2017-11-27
        • 2011-08-02
        • 2011-07-30
        相关资源
        最近更新 更多