【问题标题】:Get youtube id for all url types获取所有 url 类型的 youtube id
【发布时间】:2013-03-05 08:09:02
【问题描述】:

以下代码适用于除 youtu.be 之外的所有 YouTube 域。一个例子是:http://www.youtube.com/watch?v=ZedLgAF9aEg 会变成:ZedLgAF9aEg

我的问题是如何使它与http://youtu.be/ZedLgAF9aEg 一起工作。 我对正则表达式不是很好,所以非常感谢您的帮助。我的代码是:

    $text = preg_replace("#[&\?].+$#", "", preg_replace("#http://(?:www\.)?youtu\.?be(?:\.com)?/(embed/|watch\?v=|\?v=|v/|e/|.+/|watch.*v=|)#i", "", $text)); }
$text = (htmlentities($text, ENT_QUOTES, 'UTF-8'));

再次感谢!

【问题讨论】:

  • 我明白了。你正在做一个更换以获得ID?您想从短 URL (youtu.be) 中获取 ID?我会看看我是否能在睡前快速想出一些真正的东西,但我不建议做一个替换来解析一个简单的 ID...
  • 是的,我正在寻找 id,但它可以与 youtube.com 和 youtu.be 一起使用,用户将提交包含其内容的消息,如果他们希望包含视频,他们会做; [youtube]video_url[/youtube]

标签: php regex preg-match


【解决方案1】:
//$url = 'http://www.youtube.com/watch?v=ZedLgAF9aEg';
$url = 'http://youtu.be/ZedLgAF9aEg';

if (FALSE === strpos($url, 'youtu.be/')) {
    parse_str(parse_url($url, PHP_URL_QUERY), $id);
    $id = $id['v'];
} else {
    $id = basename($url);
}

echo $id; // ZedLgAF9aEg

适用于两个版本的 URL。 不要为此使用正则表达式,因为 PHP 已经内置了用于解析 URL 的函数,正如我所展示的那样,这些函数更快更健壮,不会被破坏。

【讨论】:

  • 虽然有用,但如果 url 是 youtube.com/watch?v=TklgWV06BUc&feature=youtu.be 则不起作用
  • $url = explode('&', $url)[0]; 除非我遗漏了一个案例,否则这应该足以处理有额外 url 参数的情况
  • 或者只使用if (FALSE === strpos($url, 'youtu.be/')) {。它将检查 args 不应该有的尾部斜杠。
【解决方案2】:

您的正则表达式似乎可以解决现在的问题?我没有在 php 中尝试过,但在我的编辑器中似乎可以正常工作。

正则表达式的第一部分 http://(?:www\.)?youtu\.?be(?:\.com)?/matches http://youtu.be/ 和第二部分 (embed/|watch\?v=|\?v=|v/|e/|.+/|watch.*v=|)|) 结尾,这意味着它匹配 nothing(使其可选)。换句话说,它会修剪掉http://youtu.be/,只留下id。

我想,如果分组是可选的,一种更直观的编写方式是使整体成为可选的,但据我所知,您的正则表达式已经解决了您的问题:

 #http://(?:www\.)?youtu\.?be(?:\.com)?/(embed/|watch\?v=|\?v=|v/|e/|.+/|watch.*v=)?#i

注意:您的正则表达式也适用于 www.youtu.be.com 域。它将被剥离,但如果您使用它来验证输入,请注意一些事项。

更新:

如果您只想匹配[youtube][/youtube] 标签内的网址,您可以使用look arounds。 大致如下:

(?<=\[youtube\])(?:http://(?:www\.)?youtu\.?be(?:\.com)?/(?:embed/|watch\?v=|\?v=|v/|e/|[^\[]+/|watch.*v=)?)(?=.+\[/youtube\])

您可以通过使前瞻中的 .+ 仅匹配有效的 URL 字符等来进一步完善它。

【讨论】:

  • 您的权利它确实有效,但为了使其嵌入,它需要位于 [youtube] [/youtube] 之间,并且 youtu.be url 最终将代码框修剪为“[youtube] youtube]”,但与其他网址一起使用时效果很好。直到现在才注意到这一点。
  • 最后一部分的.+/ 部分似乎是罪魁祸首。在不确切知道您要做什么的情况下,您可以将其更改为[^\[]+/,但我相信有更好的方法可以做到这一点。例如(embed/|watch\?v=|\?v=|v/|e/|[^\[]+/|watch.*v=)?
  • 嗯,效果很好!我很感激,你会如何改进它?我还有另一个半相关的问题,只有当用户放在 [youtube] url[/youtube] 代码大括号之间时,是否可以 preg_replace ?
  • 更新了答案以包括匹配标签。关于优化,我会在稍后找到时间。
【解决方案3】:

试试这个,希望对你有帮助

function YouTubeUrl($url)
{
if($url!='')
{
    $newUrl='';
    $videoLink1=$url;
    $findKeyWord='youtu.be';
    $toBeReplaced='www.youtube.com';
    if(IsContain('watch?v=',$videoLink1))
    {
        $newUrl=tMakeUrl($videoLink1);
    }
    else if(IsContain($videoLink1, $findKeyWord))
    {
        $videoLinkArray=explode('/',$videoLink1);
        $Protocol='';
        if(IsContain('://',$videoLink1))
        {
            $protocolArray=explode('://',$videoLink1);
            $Protocol=$protocolArray[0];
        }

        $file=$videoLinkArray[count($videoLinkArray)-1];
        $newUrl='www.youtube.com/watch?v='.$file;
        if($Protocol!='')
            $newUrl.=$Protocol.$newUrl;
        else
            $newUrl=tMakeUrl($newUrl);
    }
    else
        $newUrl=tMakeUrl($videoLink1);
    return $newUrl;
}
return '';
}

function IsContain($string,$findKeyWord)
{
     if(strpos($string,$findKeyWord)!==false)
    return true;
     else
    return false;
}

function tMakeUrl($url)
{
$tSeven=substr($url,0,7);
$tEight=substr($url,0,8);
if($tSeven!="http://" && $tEight!="https://")
{
    $url="http://".$url;
}
return $url;
}

【讨论】:

    【解决方案4】:

    您可以对任何 youtube URL 使用波纹管功能

    希望对你有帮助

    函数 checkYoutubeId($id)

    {

    $youtube = "http://www.youtube.com/oembed?url="。 $id ."&format=json";

    $curl = curl_init($youtube);

    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

    $return = curl_exec($curl);

    curl_close($curl);

    return json_decode($return, true);

    }

    如果 Id 与 youtube 视频 ID 匹配,此函数返回 Youtube 视频详细信息

    【讨论】:

      【解决方案5】:

      对@rvalvik 答案的一点改进是包括移动链接的情况(我在与使用 iPad 导航、复制和粘贴链接的客户合作时注意到了这一点)。在这种情况下,我们有一个m(移动)信件而不是www。然后正则表达式变为:

      #(https?://)?(?:www\.)?(?:m\.)?(?:youtu\.be/|youtube\.com(?:/embed/|/v/|/watch?.*?v=))([\w\-]{10,12}).*#x
      

      希望对你有帮助。

      【讨论】:

      • 这将允许 www.m. 你想使用 (?:(?:www|m)\.)?(?:www\.|m\.) 代替。无论哪种方式正则表达式都不应用于此,因为如果格式更改,它很容易破坏。 PHP 有内置函数,可以很容易地做到这一点。
      • 你说得对@crypticツ我还没有考虑过同时拥有wwwm的情况。您已经暗示了一些 PHP 内置函数来提取 YouTube id,您能否提供更多详细信息?谢谢!
      • 查看我在stackoverflow.com/a/15218823/1592648 上方发布的答案,它适用于任何域,如果参数按任何顺序排列并且比使用正则表达式要快得多。
      【解决方案6】:

      另一个答案的轻微改进:

      if (strpos($url, 'feature=youtu.be') === TRUE || strpos($url, 'youtu.be') === FALSE ) 
      {
          parse_str(parse_url($url, PHP_URL_QUERY), $id);
          $id = $id['v'];
      } 
      else 
      {
          $id = basename($url);
      }
      

      这考虑到 youtu.be 仍然在 URL 中,但不是 URL 本身(确实发生了!),因为它可能是引用功能链接。

      【讨论】:

        【解决方案7】:

        其他答案错过了一些 youtube 链接是播放列表的一部分并且具有嵌入代码所需的列表参数这一点。因此,要从链接中提取嵌入代码,可以尝试以下 JS 代码:

            let urlEmbed = "https://www.youtube.com/watch?v=iGGolqb6gDE&list=PL2q4fbVm1Ik6DCzm9XZJbNwyHtHGclcEh&index=32"
        
            let embedId = urlEmbed.split('v=')[1];
            let parameterStringList = embedId.split('&');
        
            if (parameterStringList.length > 1) {
              embedId = parameterStringList[0];
        
              let listString = parameterStringList.filter((parameterString) =>
                parameterString.includes('list')
              );
        
              if (listString.length > 0) {
                listString = listString[0].split('=')[1];
                embedId = `${parameterStringList[0]}?${listString}`;
              }
            }
        
            console.log(embedId)
        

        在这里试试:https://jsfiddle.net/AMITKESARI2000/o62dwj7q/

        【讨论】:

          【解决方案8】:

          试试这个:

          $string = explode("=","http://www.youtube.com/watch?v=ZedLgAF9aEg");
          echo $string[1];
          

          会变成:ZedLgAF9aEg

          【讨论】:

          • 不,如果里面有多个 = 怎么办?
          猜你喜欢
          • 1970-01-01
          • 2011-10-17
          • 1970-01-01
          • 2012-06-23
          • 2019-02-20
          • 1970-01-01
          • 2016-05-13
          • 2011-05-02
          • 1970-01-01
          相关资源
          最近更新 更多