[php]youtubeのurlから動画idを抽出する方法

簡単。

どういうことか

例えば

https://www.youtube.com/watch?v=_7QQAmvqJLA&ab_channel=DUELMOVIEDUELCo%2C.incOfficialYoutube

これの

_7QQAmvqJLA

これを抽出する。

動画IDだけ欲しいことは地味にある。で、いちいち手動で引っこ抜くのはめんどくさい。

ベタ打ちのURLからidだけ拾えるものを組んじゃえばいいよね。

phpでやっていく

作成理由にwordpress前提ってのがあるんでphp。機能的にはjsでも作れる。

<?php
$url = 'https://www.youtube.com/watch?v=_7QQAmvqJLA&ab_channel=DUELMOVIEDUELCo%2C.incOfficialYoutube';
parse_str(parse_url($url, PHP_URL_QUERY), $query);
if(isset($query)){
    $youtubeid = $query['v'];
    print $youtubeid;
}

注意として、共有用のURLでは動作しない。

https://youtu.be/_7QQAmvqJLA?si=BwucWhSwQJaXVh12

埋め込み用タグから拾ってもダメ。

https://www.youtube.com/embed/_7QQAmvqJLA?si=u5AQY4yq27Prqw7e

引っ張ってくる手段は複数あるわけだけど、使用時の手間を省くことを考えてurlのコピペで済ませることを採用した。まあ、それぞれ書式があるから条件分岐で対応できるんですけどね。

wordpress組込例

カスタムフィールド(SmartCustomFields)、繰り返しフィールド対応でlite-youtubeを仕込みたい場合。

繰り返しフィールドを「cf_youtube」、サブフィールドに表示真偽「show」、youtubeURL「url」とする。

<?php
$youtube = scf::get('cf_youtube');
$youtube_num = 0;
foreach( $youtube as $fields): if($fields['show']): $youtube_num++; endif; endforeach;
if($youtube_num !== 0):
    print '<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/lite-youtube-embed/0.3.0/lite-yt-embed.min.css" integrity="sha512-F+q2wTRzuK17yqnrP7XZ2R1jvzJiVVUUZW9wqDIMhiZFlsP5TTvGZtPQbwS1v+ZUp3JR4CDK1Tai6Gvvh7c2Fg==" crossorigin="anonymous" referrerpolicy="no-referrer" />';
    print '<script src="https://cdnjs.cloudflare.com/ajax/libs/lite-youtube-embed/0.3.0/lite-yt-embed.min.js" integrity="sha512-mnzNl5OgPbvEh4byaFsFh3bYSHnAvcgo4v+0yShBsFYcXps4E0p+8a1KHzgLajw50+kZEwZKuMFu8bhLZkiGlQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>';
    foreach( $youtube as $fields):
        $url = $fields['url'];
        parse_str(parse_url($url, PHP_URL_QUERY), $query);
        if(isset($query)){
            $youtubeid = $query['v'];
            $liteyoutube = '<lite-youtube videoid="'.$youtubeid.'" playlabel="Play"></lite-youtube>';
            print $liteyoutube;
        }
    endforeach;
endif;

SCFの繰り返しは空欄でも存在が真なので、入力の有無による表示の切り替えは入力内容をカウントしてやっていく必要がある($youtube_num)。どうせなら入力内容別に表示の可否を仕込んじゃえばいいよねってことで真偽「show」を付けてカウント。

そんな感じで。

追記:コピペ的なもの

作っといてなんだけど、まさか活用する日が来るとは思わなかった。

<?php
$youtube = scf::get('cf_youtube');
$youtube_num = 0;
foreach( $youtube as $fields): if($fields['show']): $youtube_num++; endif; endforeach;
if($youtube_num !== 0):
    print '<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/lite-youtube-embed/0.3.0/lite-yt-embed.min.css" integrity="sha512-F+q2wTRzuK17yqnrP7XZ2R1jvzJiVVUUZW9wqDIMhiZFlsP5TTvGZtPQbwS1v+ZUp3JR4CDK1Tai6Gvvh7c2Fg==" crossorigin="anonymous" referrerpolicy="no-referrer" />'."\n";
    print '<script src="https://cdnjs.cloudflare.com/ajax/libs/lite-youtube-embed/0.3.0/lite-yt-embed.min.js" integrity="sha512-mnzNl5OgPbvEh4byaFsFh3bYSHnAvcgo4v+0yShBsFYcXps4E0p+8a1KHzgLajw50+kZEwZKuMFu8bhLZkiGlQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>'."\n";
    foreach( $youtube as $fields):
        if($fields['show']):
            $url = $fields['url'];
            if (false !== strpos($url, 'https://www.youtube.com/watch')) {
                parse_str(parse_url($url, PHP_URL_QUERY), $query);
                if(isset($query)){
                    $youtubeid = $query['v'];
                }
            }elseif (false !== strpos($url, 'https://www.youtube.com/embed/')) {
                $youtubeid = str_replace("/", "", parse_url($url, PHP_URL_PATH));
            }elseif (false !== strpos($url, 'https://youtu.be/')) {
                $youtubeid = str_replace("/", "", parse_url($url, PHP_URL_PATH));
            }elseif (false !== strpos($url, 'https://www.youtube.com/live/')) {
                $youtubeid = str_replace("/live/", "", parse_url($url, PHP_URL_PATH));
            }
            $liteyoutube = '<lite-youtube videoid="'.$youtubeid.'" playlabel="Play"></lite-youtube>';
            print $liteyoutube."\n";
        endif;
    endforeach;
endif;

前述の3種類のほか、ライブ配信のアーカイブにも対応。

雑に条件分岐と置換で対応したけど、まあいいでしょう。
作りたてほやほやだから、ここから圧縮するかそれぞれに書き込む必要が出てくるか様子見。

「.”\n”」はソースコードで読みやすくするためのものだから、不要なら消していい。

コメント

タイトルとURLをコピーしました