从自定义域中的URL获取YouTube视频ID

时间:2015-01-28 作者:Chozen

下面是一个场景,我有一个网站,上面有数千条YouTube视频帖子,这些帖子存储在自定义字段“video\\u url”中,该字段正在自定义视频播放器中使用。

我现在使用的自定义播放器不获取整个YouTube URL,而只获取视频ID。我需要做的是找出如何从自定义字段的URL中获取YouTube视频ID,并将其放置到HTML 5视频属性中。

<video class="custom-player" data-youtube-id="YOUTUBE_ID_HERE" width="700" height="420" preload="none"></video>
谢谢。

更新:回答Chandan Chaudhary的问题https://gist.github.com/ckchaudhary/8629242#file-get-youtube-video-id-from-url

将以下内容添加到函数中。php文件。

function extractUTubeVidId($url){
    /*
    * type1: http://www.youtube.com/watch?v=9Jr6OtgiOIw
    * type2: http://www.youtube.com/watch?v=9Jr6OtgiOIw&feature=related
    * type3: http://youtu.be/9Jr6OtgiOIw
    */
    $vid_id = "";
    $flag = false;
    if(isset($url) && !empty($url)){
        /*case1 and 2*/
        $parts = explode("?", $url);
        if(isset($parts) && !empty($parts) && is_array($parts) && count($parts)>1){
            $params = explode("&", $parts[1]);
            if(isset($params) && !empty($params) && is_array($params)){
                foreach($params as $param){
                    $kv = explode("=", $param);
                    if(isset($kv) && !empty($kv) && is_array($kv) && count($kv)>1){
                        if($kv[0]==\'v\'){
                            $vid_id = $kv[1];
                            $flag = true;
                            break;
                        }
                    }
                }
            }
        }

        /*case 3*/
        if(!$flag){
            $needle = "youtu.be/";
            $pos = null;
            $pos = strpos($url, $needle);
            if ($pos !== false) {
                $start = $pos + strlen($needle);
                $vid_id = substr($url, $start, 11);
                $flag = true;
            }
        }
    }
    return $vid_id;
}
将此添加到post循环。

<?php 
$videoID = get_post_meta($post->ID, \'video_url\', true); 
echo $youtube_video_id = extractUTubeVidId($videoID);   
?>
将“video\\u url”更改为存储YouTube视频url的自定义字段名。

5 个回复
最合适的回答,由SO网友:Chozen 整理而成

Chandan Chaudhary贷款https://gist.github.com/ckchaudhary/8629242#file-get-youtube-video-id-from-url

将以下内容添加到函数中。php文件。

function extractUTubeVidId($url){
    /*
    * type1: http://www.youtube.com/watch?v=9Jr6OtgiOIw
    * type2: http://www.youtube.com/watch?v=9Jr6OtgiOIw&feature=related
    * type3: http://youtu.be/9Jr6OtgiOIw
    */
    $vid_id = "";
    $flag = false;
    if(isset($url) && !empty($url)){
        /*case1 and 2*/
        $parts = explode("?", $url);
        if(isset($parts) && !empty($parts) && is_array($parts) && count($parts)>1){
            $params = explode("&", $parts[1]);
            if(isset($params) && !empty($params) && is_array($params)){
                foreach($params as $param){
                    $kv = explode("=", $param);
                    if(isset($kv) && !empty($kv) && is_array($kv) && count($kv)>1){
                        if($kv[0]==\'v\'){
                            $vid_id = $kv[1];
                            $flag = true;
                            break;
                        }
                    }
                }
            }
        }

        /*case 3*/
        if(!$flag){
            $needle = "youtu.be/";
            $pos = null;
            $pos = strpos($url, $needle);
            if ($pos !== false) {
                $start = $pos + strlen($needle);
                $vid_id = substr($url, $start, 11);
                $flag = true;
            }
        }
    }
    return $vid_id;
}
将此添加到post循环。

<?php 
$videoID = get_post_meta($post->ID, \'video_url\', true); 
echo $youtube_video_id = extractUTubeVidId($videoID);   
?>
将“video\\u url”更改为存储YouTube视频url的自定义字段名。

SO网友:Anton Timmermans

另一种方法是使用WordPress的内置自动嵌入,core中的以下行负责自动嵌入:

add_filter( \'the_content\', array(&$this, \'autoembed\'), 8 ); 
这意味着:每当我们要显示内容时,尝试自动嵌入优先级为8的所有url。

您可以在此之前添加自定义过滤器以添加youtube url,如下所示:

add_filter( \'the_content\', \'prefix_add_youtube_videos\', 7 );
function prefix_add_youtube_videos( $content ) {
    $video = get_post_meta( get_the_ID(), \'video_url\', true );
    if ( ! empty( $video ) ) {
        $content .= $video;
    }

    return $content;
}
因此,我们添加了优先级为7的函数,因此在WordPress自动嵌入之前,WordPress将为我们嵌入视频。这就减少了您需要维护的代码。

PS嵌入很好!不要freeboot!

SO网友:deflime

如果您有任何PHP方面的经验,甚至是基本经验,那么可以直接进行设置。

看看explodesubstr.

<?php

  // explode() will split the string up into an array, for ex:
  $youtube_url = \'https://www.youtube.com/watch?v=dQw4w9WgXcQ\';
  $youtube_array = explode(\'?v=\', $youtube_url);

  // we used \'?v=\' as the delimter, so explode will create an array of two parts, the first being everything before the delimiter and the second being everything after (the YouTube ID)

        print_r($youtube_array);
        // will print: Array ( [0] => https://www.youtube.com/watch [1] => dQw4w9WgXcQ )

        echo $youtube_array[1];
        // will echo: dQw4w9WgXcQ
?>
如果您输入的所有YouTube链接都遵循完全相同的格式(例如:https://www.youtube.com/watch?v=dQw4w9WgXcQ) 那么我们在这里的工作就完成了。但是,我们都知道YouTube链接有各种形状和大小,并附加了额外的变量。

<?php

  // lets use a more complicated link
  $youtube_url = \'https://www.youtube.com/watch?v=dQw4w9WgXcQ&list=RDdQw4w9WgXcQ#t=0\';
  $youtube_array = explode(\'?v=\', $youtube_url);

        print_r($youtube_array);
        // will print: Array ( [0] => https://www.youtube.com/watch [1] => dQw4w9WgXcQ&list=RDdQw4w9WgXcQ#t=0 )

        echo $youtube_array[1];
        // will echo: dQw4w9WgXcQ&list=RDdQw4w9WgXcQ#t=0

        // we can use substr() to pull out just the id by cuting it down to the first 11 characters of the string, all YouTube IDs are 11 characters
        $youtube_id = substr($youtube_array[1], 0, 11);

        echo $youtube_id;
        // will echo: dQw4w9WgXcQ
?>  
当然,一些YouTube链接也可以遵循以下格式:http://youtu.be/dQw4w9WgXcQ. 将使用不同的分隔符.be/ 您可以编写一个函数来检查两者。请告诉我们您的PHP经验水平。并检查所有链接的格式。看看上面这两个函数。

SO网友:Dev

您可以在模板中直接使用它,也可以将其与某种类型的操作或过滤器挂钩一起使用

wp_oembed_get( get_post_meta( get_the_ID(), \'video_url\', true ) );

SO网友:Marty McGee

我使用正则表达式匹配并从url返回youtube视频id:

<?php    
  /**
   * Match non-linked youtube URL in the wild.
   * : Regex Overview/Pseudo-code :
   * 
   * Required scheme. Either http or https.
   * Optional subdomain.
   * Group host alternatives.
   * Either youtu.be
   * or youtube.com 
   * or youtube-nocookie.com
   * followed by
   * Allow anything up to VIDEO_ID,
   * but char before ID is non-ID char.
   * End host alternatives.
   * $1: VIDEO_ID is exactly 11 chars.
   * Assert next char is non-ID or EOS.
   * Assert URL is not pre-linked.
   * Allow URL (query) remainder.
   * Group pre-linked alternatives.
   * Either inside a start tag,
   * or inside <a> element text contents.
   * End recognized pre-linked alts.
   * End negative lookahead assertion.
   * Consume any URL (query) remainder.
   */

function getYoutubeVideoID ( $youtube_url ) {

  return preg_replace(\'~https?://(?:[0-9A-Z-]+\\.)?(?:youtu\\.be/| youtube(?:-nocookie)?\\.com\\S*[^\\w\\s-])([\\w-]{11})(?=[^\\w-]|$)(?![?=&+%\\w.-]*(?:[\\\'"][^<>]*>| </a>))[?=&+%\\w.-]*~ix\', \'$1\', $youtube_url);

}
通过提供youtube url调用函数,如下所示:

// example urls
$this_video_url = \'https://youtu.be/RVWtSsMUBD0\';
$this_video_url = \'https://www.youtube.com/watch?v=RVWtSsMUBD0\';

$this_youtube_id = getYoutubeVideoID( $this_video_url );
echo \'YouTube ID: \' . $this_youtube_id;

结束

相关推荐

嵌入YouTube视频的静态图像,而不是空白播放器?

幸亏this answer 我在文本小部件中嵌入了YouTube视频,使用[video src=\"http://youtu.be/JQ_2De2cnzI&rel=0&showinfo=0\"] 但是,加载页面时,它显示为此空白播放器:我尝试添加&start=1 让它显示视频的第一帧,但这没有任何效果。如何让这个嵌入式播放器显示视频中的静止图像,而不是这个空白播放器?