【问题标题】:YouTube Vimeo Video ID from Embed Code or From URL with PHP Regular Expression RegExYouTube Vimeo 视频 ID 来自嵌入代码或来自带有 PHP 正则表达式 RegEx 的 URL
【发布时间】:2011-07-02 12:59:41
【问题描述】:

我想通过其嵌入代码或从 URL 获取 YouTube 或 Vimeo 的视频 ID,任何使用 PHP 的解决方案?

【问题讨论】:

    标签: php regex youtube vimeo


    【解决方案1】:

    您可以使用 preg_match 获取 ID。我将在这个答案的后面介绍表达式本身,但这里是如何使用 preg_match 的基本思想:

    preg_match('expression(video_id)', "http://www.your.url.here", $matches);
    $video_id = $matches[1];
    

    以下是您询问的每种可能输入类型的表达式细分。我为每个链接添加了一个链接,显示了一些测试用例和结果。

    1. 对于 YouTube 网址,例如 http://www.youtube.com/watch?v=89OpN_277yY,您可以使用 this 表达式:

      v=(.{11})
      
    2. YouTube 嵌入代码可能看起来像这样(一些无关的东西被剪掉了):

      <object width="640" height="390">
          <param name="movie" value="http://www.youtube.com/v/89OpN_277yY?fs=...
          ...
      </object>
      

      或者像这样:

      <iframe ... src="http://www.youtube.com/embed/89OpN_277yY" ... </iframe>
      

      因此,从任一样式获取 ID 的表达式将是 this:

      \/v\/(.{11})|\/embed\/(.{11})
      
    3. Vimeo 网址 看起来像 http://vimeo.com/&lt;integer&gt;,据我所知。我发现的最低只是http://vimeo.com/2,我不知道是否有上限,但我现在假设它限制为 10 位数。希望知道细节的人可以纠正我。可以使用This 表达式:

      vimeo\.com\/([0-9]{1,10})
      
    4. Vimeo 嵌入代码采用这种形式:

      <iframe src="http://player.vimeo.com/video/<integer>" width="400" ...
      

      所以你可以使用this 表达式:

      player\.vimeo\.com\/video\/([0-9]{1,10})
      

      或者,如果数字的长度最终可能超过 10,您可以使用:

      player\.vimeo\.com\/video/([0-9]*)"
      

      请记住,如果您将表达式括在双引号中," 需要使用 \ 进行转义。


    总而言之,我不确定您想如何实现这一点,但您可以将所有表达式与| 组合在一起,或者您可以分别匹配每个表达式。如果您希望我提供有关如何组合表达式的更多详细信息,请对此答案添加评论。

    【讨论】:

    • 当我将这些正则表达式与 preg_match 一起使用时,我似乎没有得到任何匹配。我应该以某种方式修改它们还是正则表达式风格不同?
    • 不要忘记/分隔符。例如对于 Vimeo 使用: preg_match('/player\.vimeo\.com\/video\/([0-9]{1,10})/', "your.url.here", $matches); $video_id = $matches[1];
    【解决方案2】:

    这里回答了另一个类似的 [仅适用于 youtube],看看可能会有用。 PHP Regex to get youtube video ID?

    【讨论】:

      【解决方案3】:

      另一个问题有很多很好的答案,特别是来自@user2200660。

      https://stackoverflow.com/a/16841070/3850405

      我更喜欢使用既可以处理嵌入式代码也可以处理当前使用的任何 URL 的正则表达式。

      http://vimeo.com/423630
      https://vimeo.com/1399176
      http://vimeo.com/423630087
      https://vimeo.com/423630087
      https://player.vimeo.com/video/423630087
      https://player.vimeo.com/video/423630087?title=0&byline=0&portrait=0
      https://vimeo.com/channels/staffpicks/423630087
      https://vimeo.com/showcase/7008490/video/407943692
      

      可以处理我遇到的所有 URL 的正则表达式:

      (https?:\/\/)?(www\.)?(player\.)?vimeo\.com\/?(showcase\/)*([0-9))([a-z]*\/)*([0-9]{6,11})[?]?.*
      

      https://regex101.com/r/p2Kldc/1/

      $vimeo = 'http://player.vimeo.com/video/67019023';
      
      if(preg_match("/(https?:\/\/)?(www\.)?(player\.)?vimeo\.com\/?(showcase\/)*([0-9))([a-z]*\/)*([0-9]{6,11})[?]?.*/", $vimeo, $output_array)) {
          echo "Vimeo ID: $output_array[6]";
      }
      

      感谢@zeckdude 提供 PHP 中的原始示例代码。

      https://stackoverflow.com/a/29860052/3850405

      JavaScript 版本:

      https://stackoverflow.com/a/65846269/3850405

      【讨论】:

        【解决方案4】:

        根据最新的 youtube 标准,您可以使用以下代码从嵌入代码中提取视频 ID。

        $embed = '<iframe src="//www.youtube.com/embed/n6WYu-pSXH8" frameborder="0"></iframe>';
        preg_match('~embed/(.*?)"~', $embed, $output);
        echo $output[1];
        

        谢谢

        【讨论】:

          猜你喜欢
          • 2013-03-19
          • 1970-01-01
          • 1970-01-01
          • 2012-03-22
          • 1970-01-01
          • 2017-05-01
          • 2012-07-15
          • 2011-04-08
          • 2011-12-09
          相关资源
          最近更新 更多