正規表現
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);