javascript ver

参考リンク:

//動画IDを取得する関数を作成
  const getParameterByName = function(name, url){
    //ULRをクエリで分割して配列化
    let queryString = url.split('?');
    //URLにクエリがあった場合
    if(queryString.length >= 2){
      //複数のパラメーターがあれば分割して配列化
      let paras = queryString[1].split('&');
      //指定したパラメーターの値を取得
      for(let i = 0; i < paras.length; i++){
        //パラメーターを名前と値で分割
        let eachPara = paras[i].split('=');
        //パラメーター名が指定のものと一致したら値を返して関数処理を終了
        if(eachPara[0] == name) return eachPara[1];
      }
    }
    //URLに指定のパラメーターが無い場合はnullを返す
    return null;
  };

//動画IDを埋め込みコードに置換する関数を作成
  const idToEmbed = function(id){
    let ytIframe = '';
    return ytIframe;
  };

//動画IDを取得する関数を作成
  const ytUrlRegExp = /(?<!=\")\b(?:https?):\/\/(?:www\.)?(?:youtube\.com|youtu\.be)\/[\w!?/+\-|:=~;.,*&@#$%()'"[\]]+/g;
  //否定後読みで除外を使用しない場合
  const ytUrlRegExp = /\b(?:https?):\/\/(?:www\.)?(?:youtube\.com|youtu\.be)\/[\w!?/+\-|:=~;.,*&@#$%()'"[\]]+/g;

//テキスト内のYouTubeの動画URLを探して置換処理する関数を作成
  const changeToEmbed = function(txt){
    //テキスト内からホスト名がyoutubeのURLにマッチする文字列をすべて取得
    let urls = txt.match(ytUrlRegExp);
    //youtubeのURLがあった場合
    if(urls){
      //すべてのURLをチェックして置換処理
      for(let i = 0; i < urls.length; i++){
        let url = urls[i],
            youTubeId,
            replaceRegExp;
        //URLにクエリがある場合
        if(url.match(/\?/) != null){
          //URLからID(パラメーター名vの値)の部分を抽出
          youTubeId = getParameterByName('v', url) ? getParameterByName('v', url) : false;
        }else if(url.match(/(youtube\.com\/watch|youtu\.be)/) != null){
        //URLにクエリが無く、動画のURLかショートコードの場合
          //URLからIDの部分を抽出
          youTubeId = (/(?:https?):\/\/(?:www\.)?(?:youtube\.com\/watch|youtu\.be)\/(.+)/g).exec(url)[1];
        }
        //テキスト内の該当URLの箇所をiframeのコードに置換
        if(youTubeId){
         replaceRegExp = new RegExp('(?<!=\")(?:'+url.replace('.', '\\.').replace('?', '\\?')+')');
         txt = txt.replace(replaceRegExp, idToEmbed(youTubeId));
        }
      }
    }
    return txt;
  };

PHP ver

参考リンク:

//動画IDから埋め込み
  function ag2id_to_embed($id){
    $yt_iframe = '';
    return $yt_iframe;
  }

//動画IDからサムネイル
function ag2id_to_thum480($id,$type='start'){
  $thum = 'hq1.jpg';
  if ($type === 'mid') $thum = 'hq2.jpg';
  if ($type === 'end') $thum = 'hq3.jpg';
  $yt_thum = 'http://img.youtube.com/vi/'.$id.'/'.$thum;
  return $yt_thum;
}

YouTubeのいろいろなURLから動画のIDを取り出す正規表現

参考リンク:YouTubeのいろいろなURLから動画のIDを取り出す正規表現

  //
function get_youtube_id_from_url($url) {
    preg_match('/(http(s|):|)\/\/(www\.|)yout(.*?)\/(embed\/|watch.*?v=|)([a-z_A-Z0-9\-]{11})/i', $url, $results);
    return $results[6];
}

PHP、テキストからURLを抽出する

参考リンク:PHP、テキストからURLを抽出する

//
preg_match_all('(https?://[-_.!~*\'()a-zA-Z0-9;/?:@&=+$,%#]+)', 元テキスト, 結果(抽出URL)配列)

if(preg_match_all('(https?://[-_.!~*\'()a-zA-Z0-9;/?:@&=+$,%#]+)', $text, $result) !== false){
//最初の一つだけ
    foreach ($result[0] as $value){
        //URL表示
        print $value . '
'; } foreach ($result as &$value) { $yuid = get_youtube_id_from_url($value); if($yuid) return $yuid; } }
コンテンツからYUTUBEサムネイルまたは最初の画像のURLを出力!

Movabeltypeに実装!!

  //上述の、ag2id_to_thum480関数を使用!!
function get_content_firstimage($content,$type='start') {
//YOUTUBEの動画IDを抽出するパターン
  $ytbeptrn = '/(http(s|):|)\/\/(www\.|)yout(.*?)\/(embed\/|watch.*?v=|)([a-z_A-Z0-9\-]{11})/i';
  if(preg_match($ytbeptrn, $content, $results)){
//動画IDが抽出されたらサムネイル画像URLを生成
    if(is_array($results)&& isset($results[6]))  return ag2id_to_thum480($results[6],$type);
  };
//画像リンクを抽出するパターン
  $imgptrn = '/<img.*?src\s*=\s*[\"|\'](.*?)[\"|\'].*?>/i';
  if(preg_match($imgptrn, $content, $imgs)){
//画像が抽出されたら画像URLを返す
    if(is_array($imgs)&& isset($imgs[1])) return $imgs[1];
  }
//何も抽出されない場合
  return false;
};

テキスト内のURLからiframe生成
  //
  function ag2get_the_parameter($name, $url){
    //ULRをクエリで分割
    $query_string = explode('?', $url);
    //URLにクエリがあった場合
    if(count($query_string) >= 2){
      //複数のパラメーターがあれば分割
      $paras = explode('&', $query_string[1]);
      //$parasから指定のパラメーターを取得
      for($i = 0; $i < count($paras); $i++){
        //パラメーターを名前と値で分割
        $each_para = explode('=', $paras[$i]);
        //パラメーター名が指定のものと一致したら値を返して関数処理を終了
        if($each_para[0] == $name) return $each_para[1];
      }
    }
    //指定のパラメーターが無ければfalseを返す
    return false;
  }
  function ag2change($txt,$type='start'){//mid, end, embed
    $look_behind = '(?<!=\")';//否定後読み
    $yt_url_regex = '/'.str_replace('/','\\/',$look_behind).'(?:https?):\/\/(?:www\.)?(?:youtube\.com|youtu\.be)\/[\w!?\/+\-|:=~;.,*&@#$%()\'"[\]]+/';
    $yt_watch_regex = '/(?:https?):\/\/(?:www\.)?(?:youtube\.com\/watch|youtu\.be)\/(.+)/';
    //テキスト内からyoutubeのURLにマッチする文字列をすべて取得
    preg_match_all($yt_url_regex, $txt, $urls, PREG_SET_ORDER);
    if($urls){
      $yt_url_regex = [];
      //すべてのURLをチェックして動画のURLなら置換
      for($i = 0; $i < count($urls); $i++){
        $yt_id = false;
        $url = $urls[$i][0];
        //クエリがある場合
        if(preg_match('/\?/', $url)){
          //URLから動画IDを抽出
          $yt_id = ag2get_the_parameter('v', $url) ? ag2get_the_parameter('v', $url) : false;
        }else if(preg_match('/youtube\.com\/watch|youtu\.be/', $url)){
        //URLにクエリが無い場合
          //動画のURLかショートコードならURLのID部分を抽出
          preg_match($yt_watch_regex, $url, $yt_id, PREG_OFFSET_CAPTURE);
          $yt_id = $yt_id[1][0];
        }
        //テキスト内の該当URLの置換処理
        if($yt_id){
         if($type !== 'embed'){
          $yt_url_regex[$i] = '/'.str_replace('/','\\/',$look_behind).preg_quote($url,'/').'/';
          $txt = preg_replace($yt_url_regex[$i], ag2id_to_thum480($yt_id,$type), $txt);
          return $txt;
         }
         if($type === 'embed'){
          $yt_url_regex[$i] = '/'.str_replace('/','\\/',$look_behind).preg_quote($url,'/').'/';
          $txt = preg_replace($yt_url_regex[$i], ag2id_to_embed($yt_id), $txt);
          return $txt;
         }
        }
      }
    }
    return false;
  }

  $text = '自動置換の処理をしたいテキスト全文。';
  $text = ag2change_to_embed($text);