获取所有网址类型的youtube ID

时间:2013-03-05 08:09:02

标签: php regex preg-match

以下代码适用于除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'));

再次感谢!

8 个答案:

答案 0 :(得分:2)

//$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

适用于两种版本的网址。 不要使用正则表达式,因为PHP内置了解析URL的函数,正如我所演示的那样,它们更快,更强大,可以防止破坏。

答案 1 :(得分:2)

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

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

更直观的写作方式是将整个if grouping分组设为可选的,但据我所知,你的正则表达式已经解决了你的问题:

 #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\])

您可以通过使前瞻中的.+仅匹配有效的网址字符等来进一步优化它。

答案 2 :(得分:0)

试试这个,希望它能帮到你

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;
}

答案 3 :(得分:0)

您可以对任何youtube网址

使用bellow功能

我希望这会对你有所帮助

function checkYoutubeId($ id)

{

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

$ curl = curl_init($ youtube);

curl_setopt($ curl,CURLOPT_RETURNTRANSFER,1);

$ return = curl_exec($ curl);

curl_close($卷曲);

返回json_decode($ return,true);

}

如果Id与YouTube视频ID匹配,此功能会返回Youtube视频详细信息

答案 4 :(得分:0)

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

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

希望它有所帮助。

答案 5 :(得分:0)

另一个答案略有改善:

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本身(确实发生了!),因为它可能是引用功能链接。

答案 6 :(得分:0)

其他答案忽略了一些 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/

答案 7 :(得分:-2)

试试这个:

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

会变成:ZedLgAF9aEg