26

PHP 字符串中找到一个Youtube视频 链接并将其转换嵌入代码

嵌入代码:

<iframe width="420" height="315" src="//www.youtube.com/embed/0GfCP5CWHO0" frameborder="0" allowfullscreen></iframe>

PHP代码/字符串:

<?php echo $post_details['description']; ?>

优酷链接:

http://www.youtube.com/watch?v=0GfCP5CWHO0
4

13 回答 13

42

试试这个:

preg_replace("/\s*[a-zA-Z\/\/:\.]*youtube.com\/watch\?v=([a-zA-Z0-9\-_]+)([a-zA-Z0-9\/\*\-\_\?\&\;\%\=\.]*)/i","<iframe width=\"420\" height=\"315\" src=\"//www.youtube.com/embed/$1\" frameborder=\"0\" allowfullscreen></iframe>",$post_details['description']);
于 2013-09-27T12:43:14.470 回答
33

一个视频有两种类型的 youtube 链接:

例子:

$link1 = 'https://www.youtube.com/watch?v=NVcpJZJ60Ao';
$link2 = 'https://www.youtu.be/NVcpJZJ60Ao';

该函数同时处理:

function getYoutubeEmbedUrl($url)
{
     $shortUrlRegex = '/youtu.be\/([a-zA-Z0-9_-]+)\??/i';
     $longUrlRegex = '/youtube.com\/((?:embed)|(?:watch))((?:\?v\=)|(?:\/))([a-zA-Z0-9_-]+)/i';

    if (preg_match($longUrlRegex, $url, $matches)) {
        $youtube_id = $matches[count($matches) - 1];
    }

    if (preg_match($shortUrlRegex, $url, $matches)) {
        $youtube_id = $matches[count($matches) - 1];
    }
    return 'https://www.youtube.com/embed/' . $youtube_id ;
}

$link1 或 $link2 的输出将是相同的:

 $output1 = getYoutubeEmbedUrl($link1);
 $output2 = getYoutubeEmbedUrl($link2);
 // output for both:  https://www.youtube.com/embed/NVcpJZJ60Ao

现在您可以在 iframe 中使用输出了!

于 2017-01-28T12:59:38.867 回答
32

对 Joran 处理 youtube 短 URL 格式的解决方案进行了一些改进:

function convertYoutube($string) {
    return preg_replace(
        "/\s*[a-zA-Z\/\/:\.]*youtu(be.com\/watch\?v=|.be\/)([a-zA-Z0-9\-_]+)([a-zA-Z0-9\/\*\-\_\?\&\;\%\=\.]*)/i",
        "<iframe src=\"//www.youtube.com/embed/$2\" allowfullscreen></iframe>",
        $string
    );
}

您可以在此处在线测试此功能

于 2014-12-05T13:56:49.733 回答
14

用于生成任何 FB/vimeo/youtube 视频的嵌入 url 链接的快速功能。

public function generateVideoEmbedUrl($url){
    //This is a general function for generating an embed link of an FB/Vimeo/Youtube Video.
    $finalUrl = '';
    if(strpos($url, 'facebook.com/') !== false) {
        //it is FB video
        $finalUrl.='https://www.facebook.com/plugins/video.php?href='.rawurlencode($url).'&show_text=1&width=200';
    }else if(strpos($url, 'vimeo.com/') !== false) {
        //it is Vimeo video
        $videoId = explode("vimeo.com/",$url)[1];
        if(strpos($videoId, '&') !== false){
            $videoId = explode("&",$videoId)[0];
        }
        $finalUrl.='https://player.vimeo.com/video/'.$videoId;
    }else if(strpos($url, 'youtube.com/') !== false) {
        //it is Youtube video
        $videoId = explode("v=",$url)[1];
        if(strpos($videoId, '&') !== false){
            $videoId = explode("&",$videoId)[0];
        }
        $finalUrl.='https://www.youtube.com/embed/'.$videoId;
    }else if(strpos($url, 'youtu.be/') !== false){
        //it is Youtube video
        $videoId = explode("youtu.be/",$url)[1];
        if(strpos($videoId, '&') !== false){
            $videoId = explode("&",$videoId)[0];
        }
        $finalUrl.='https://www.youtube.com/embed/'.$videoId;
    }else{
        //Enter valid video URL
    }
    return $finalUrl;
}
于 2018-03-01T09:23:38.770 回答
4

例子:

$link1 = getEmbedUrl('https://www.youtube.com/watch?v=BIjqw7zuEVE');
$link2 = getEmbedUrl('https://vimeo.com/356810502');
$link3 = getEmbedUrl('https://example.com/link/12345');

功能:

function getEmbedUrl($url) {
    // function for generating an embed link
    $finalUrl = '';

    if (strpos($url, 'facebook.com/') !== false) {
        // Facebook Video
        $finalUrl.='https://www.facebook.com/plugins/video.php?href='.rawurlencode($url).'&show_text=1&width=200';

    } else if(strpos($url, 'vimeo.com/') !== false) {
        // Vimeo video
        $videoId = isset(explode("vimeo.com/",$url)[1]) ? explode("vimeo.com/",$url)[1] : null;
        if (strpos($videoId, '&') !== false){
            $videoId = explode("&",$videoId)[0];
        }
        $finalUrl.='https://player.vimeo.com/video/'.$videoId;

    } else if (strpos($url, 'youtube.com/') !== false) {
        // Youtube video
        $videoId = isset(explode("v=",$url)[1]) ? explode("v=",$url)[1] : null;
        if (strpos($videoId, '&') !== false){
            $videoId = explode("&",$videoId)[0];
        }
        $finalUrl.='https://www.youtube.com/embed/'.$videoId;

    } else if(strpos($url, 'youtu.be/') !== false) {
        // Youtube  video
        $videoId = isset(explode("youtu.be/",$url)[1]) ? explode("youtu.be/",$url)[1] : null;
        if (strpos($videoId, '&') !== false) {
            $videoId = explode("&",$videoId)[0];
        }
        $finalUrl.='https://www.youtube.com/embed/'.$videoId;

    } else if (strpos($url, 'dailymotion.com/') !== false) {
        // Dailymotion Video
        $videoId = isset(explode("dailymotion.com/",$url)[1]) ? explode("dailymotion.com/",$url)[1] : null;
        if (strpos($videoId, '&') !== false) {
            $videoId = explode("&",$videoId)[0];
        }
        $finalUrl.='https://www.dailymotion.com/embed/'.$videoId;

    } else{
        $finalUrl.=$url;
    }

    return $finalUrl;
}
于 2020-05-13T06:09:23.230 回答
3

我知道这是一个旧线程,但对于任何有此挑战并寻求帮助的人,我在 GitHub - Embera上找到了一个 PHP 类。

基本上是一个 oembed 库,可将任何字符串中的 YouTube URL 转换为关联的 iframe 元素。我正在使用它,并将继续在任何地方使用它!

于 2016-07-02T04:23:14.260 回答
3

我认为获取 id 的一种安全、超级简单的方法
是简单地使用 URL 结构。

function getYoutubeEmbedUrl($url){

    $urlParts   = explode('/', $url);
    $vidid      = explode( '&', str_replace('watch?v=', '', end($urlParts) ) );

    return 'https://www.youtube.com/embed/' . $vidid[0] ;
}
于 2018-08-14T09:22:31.033 回答
1

以下适用于所有类型的 YouTube 网址。

preg_match('%(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i', $url, $match);

$youtube_id = $match[1];
于 2018-01-06T18:20:26.887 回答
1
<?php
$url = 'https://www.youtube.com/watch?v=u9-kU7gfuFA';
preg_match('/[\\?\\&]v=([^\\?\\&]+)/', $url, $matches);
$id = $matches[1];
$width = '800px';
$height = '450px'; ?>

<iframe id="ytplayer" type="text/html" width="<?php echo $width ?>" height="<?php echo $height ?>"
src="https://www.youtube.com/embed/<?php echo $id ?>?rel=0&showinfo=0&color=white&iv_load_policy=3"
frameborder="0" allowfullscreen></iframe> 
于 2018-03-04T12:17:55.763 回答
0

好吧,您需要先过滤掉 youtube 链接并将它们放入一个数组中。接下来,您需要找出 url 的视频 id,这很容易。使用这个脚本:

function getIDfromURL() {
var video_url = document.getElementById('url').value;
var video_id = video_url.split('v=')[1];
var ampersandPosition = video_id.indexOf('&');
if (ampersandPosition != -1) { video_id = video_id.substring(0, ampersandPosition); }
document.getElementById('url').value=video_id;
}

当然也可以使用 PHP 函数,但我这里只是使用 JS 从 URL 中获取 id。也许无论如何都有帮助;)

使用视频 ID,您可以嵌入视频;)

于 2013-09-27T12:46:09.450 回答
0

如果字符串来自用户输入,或者以任何方式不可预测,那么请认真地忘记使用 RegEx。它会为你打开一罐蠕虫。

相反,尝试使用 HTML 解析器根据某些规则和选择器提取 URL。

我主要使用 ColdFsuion / Java,JSoup 非常适合这种事情,而且也更加轻松和安全。

http://jsoup.org/

看来,在 PHP 中,你可以使用这样的东西:

http://code.google.com/p/phpquery/

我很想提供一个代码示例,但我对 PHP 的了解不够。但是试一试。

米奇。

于 2013-09-27T12:57:27.780 回答
0

另一个简单的选择是使用parse_urlparse_str函数。

function getYoutubeEmbedUrl ($url) {
  $parsedUrl = parse_url($url);
  # extract query string
  parse_str(@$parsedUrl['query'], $queryString);
  $youtubeId = @$queryString['v'] ?? substr(@$parsedUrl['path'], 1);

  return "https://youtube.com/embed/{$youtubeId}";
}

假设我们有这两个链接:

$link1 = 'https://www.youtube.com/watch?v=NVcpJZJ60Ao';
$link2 = 'https://www.youtu.be/NVcpJZJ60Ao';

getYoutubeEmbedUrl($link1); // https://youtube.com/embed/NVcpJZJ60Ao
getYoutubeEmbedUrl($link2); // https://youtube.com/embed/NVcpJZJ60Ao

解释

parse_url函数会将链接提取为 4 个组件:schemehostpathquery (参见文档)

parse_url($link1);

// output
[
  "scheme" => "https",
  "host" => "www.youtube.com",
  "path" => "/watch",
  "query" => "v=NVcpJZJ60Ao",
]

的输出$link2将是:

parse_url($link2);

// output
[
  "scheme" => "https",
  "host" => "www.youtu.be",
  "path" => "/NVcpJZJ60Ao",
]

并将parse_str查询字符串转换为数组(参见文档)

parse_str('v=NVcpJZJ60Ao', $output);

// value of variable $output
[
  "v" => "NVcpJZJ60Ao",
]
于 2021-01-07T10:47:48.753 回答
0

也试试这个:

$text = "is here the text to replace"; 

 function replace_iframe($id_video) {
    return '<iframe height="315"  width="100%" src="https://www.youtube.com/embed/'.$id_video[1].'" frameborder="0" allowfullscreen></iframe>';
 }

echo preg_replace_callback("/\s*[a-zA-Z\/\/:\.]*(?:youtube\.com|youtu\.be)\/(?:watch\?v=)?([a-zA-Z0-9\-_]+)([a-zA-Z0-9\/\*\-\_\?\&\;\%\=\.]*)/i", 'replace_iframe', $text);
于 2021-09-27T23:06:06.620 回答