フォームに入力されたyoutubeのURLから埋め込みコードを生成したい
なんてことがあるとする。
URLをから動画のIDだけ取ってくるのであれば以下の正規表現で片付く
# v=([-\w]{11})#
ご存知の通り、youtubeのURLはパラメータをくっつけていろんな再生設定が可能である。
例えばこんな感じ
- 指定の時間から再生する
https://www.youtube.com/watch?v=sXrxmR8wO7A&t=10 - リスト再生
https://www.youtube.com/watch?v=XVfdS7t-iLU&list=PLgtRDsudgFDAKjcrTIzU-fFdTNuLFViDF
これらの、ユーザーがフォームに入力したURLのパラメータを埋め込みコードに反映したいなんてことがあるとする
動画埋め込み用のパラメータはご覧の通り、たくさんあるので
https://developers.google.com/youtube/player_parameters?hl=ja#Parameters
今回は時間指定(t=〜〜)とリスト(list=〜〜)を対応できる処理を作ってみる
/**
* youtubeのURLから埋め込みタグを生成する
*
* @param string $param youtubeのURL
* @return string 埋め込みタグ
*/
public function createvideotag($param)
{
//とりあえずURLがyoutubeのURLであるかをチェック
if(preg_match('#https?://www.youtube.com/.*#i',$param,$matches)){
//parse_urlでhttps://www.youtube.com/watch以下のパラメータを取得
$parse_url = parse_url($param);
// 動画IDを取得
if (preg_match('#v=([-\w]{11})#i', $parse_url['query'], $v_matches)) {
$video_id = $v_matches[1];
} else {
// 万が一動画のIDの存在しないURLだった場合は埋め込みコードを生成しない。
return false;
}
$v_param = '';
// パラメータにt=XXmXXsがあった時の埋め込みコード用パラメータ設定
// t=〜〜の部分を抽出する正規表現は記述を誤るとlist=〜〜の部分を抽出してしまうので注意
if (preg_match('#t=([0-9ms]+)#i', $parse_url['query'], $t_maches)) {
$time = 0;
if (preg_match('#(\d+)m#i', $t_maches[1], $minute)) {
// iframeでは正の整数のみ有効なのでt=XXmXXsとなっている場合は整形する必要がある。
$time = $minute[1]*60;
}
if (preg_match('#(\d+)s#i', $t_maches[1], $second)) {
$time = $time+$second[1];
}
if (!preg_match('#(\d+)m#i', $t_maches[1]) && !preg_match('#(\d+)s#i', $t_maches[1])) {
// t=(整数)の場合はそのままの値をセット ※秒数になる
$time = $t_maches[1];
}
$v_param .= '?start=' . $time;
}
// パラメータにlist=XXXXがあった時の埋め込みコード用パラメータ設定
if (preg_match('#list=([-\w]+)#i', $parse_url['query'], $l_maches)) {
if (!empty($v_param)) {
// $v_paramが既にセットされていたらそれに続ける
$v_param .= '&list=' . $l_maches[1];
} else {
// $v_paramが既にセットされていなかったら先頭のパラメータとしてセット
$v_param .= '?list=' . $l_maches[1];
}
}
// 埋め込みコードを返す
return '<iframe width="600" height="338" src="https://www.youtube.com/embed/' . $video_id . $v_param . '" frameborder="0" allowfullscreen></iframe>';
}
// パラメータが不正(youtubeのURLではない)ときは埋め込みコードを生成しない。
return false;
}