2

以下代码适用于除youtu.be. 一个例子是: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'));

再次感谢!

4

8 回答 8

3
//$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 的函数,正如我所展示的那样,这些函数更快、更强大,可以防止破坏。

于 2013-03-05T08:15:15.667 回答
2

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

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

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

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

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

更新:

如果您只想匹配[youtube][/youtube]标签内的 url,您可以使用look arounds。类似于以下内容:

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

您可以通过使.+in the look ahead 仅匹配有效的 URL 字符等来进一步完善它。

于 2013-03-05T08:29:34.633 回答
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;
}
于 2013-03-05T08:13:51.840 回答
0

您可以对任何 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);

返回 json_decode($return, true);

}

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

于 2013-07-30T06:21:49.247 回答
0

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

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

希望能帮助到你。

于 2014-01-15T19:40:35.893 回答
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 本身(确实发生了!),因为它可能是引用功能链接。

于 2014-03-31T15:01:14.743 回答
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/

于 2021-06-09T19:53:05.050 回答
-2

试试这个 :

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

会变成:ZedLgAF9aEg

于 2013-03-05T08:15:59.917 回答