私は、YoutubeとVimeoのURLに一致するように、複数のプロジェクトにわたってこれらの正規表現を微調整してきました。どちらもマッチングに最適で、PHPを使用preg_match
してURL全体またはビデオIDのみを取得できます。私は自分のプロジェクトでそれを使用して、ビデオURLからIDを取得し、デフォルトの埋め込みが提供するよりも優れたYoutubeプレーヤーをフォーマットします。
/**
* Fetches the ID of a Vimeo video given a URL
*
* @param string $source Vimeo URL
*
* @return mixed A video ID if matched, otherwise false
*/
function video_id_from_vimeo_url($source)
{
$pattern = "/^(?:(?:https?:\/\/)?(?:www\.)?vimeo\.com.*\/([\w\-]+))/is";
$matches = array();
preg_match($pattern, $source, $matches);
if (isset($matches[1])) return $matches[1];
return false;
}
/**
* Fetches the ID of a YouTube video given a URL
*
* @param string $source YouTube URL
*
* @return mixed A video ID if matched, otherwise false
*/
function video_id_from_youtube_url($source)
{
$pattern = '/^(?:(?:(?:https?:)?\/\/)?(?:www\.)?(?:youtu(?:be\.com|\.be))\/(?:watch\?v\=|v\/|embed\/)?([\w\-]+))/is';
$matches = array();
preg_match($pattern, $source, $matches);
if (isset($matches[1])) return $matches[1];
return false;
}
/**
* Generate a URL to a YouTube video with a YouTube video ID
*
* @param string $id YouTube video ID
* @param array $params Query params to send to video
*
* @return string A YouTube URL
*/
function youtube_video_url_with_id($id, array $params = array())
{
$query = empty($params) ? '' : '?' . http_build_query($params);
return esc_url("//youtube.com/embed/{$id}{$query}");
}
/**
* Generate a URL to a Vimeo video with a Vimeo video ID
*
* @param string $id Vimeo video ID
* @param array $params Query params to send to video
*
* @return string A Vimeo URL
*/
function vimeo_video_url_with_id($id, array $params = array())
{
$defaults = array(
'color' => 'ffffff',
'title' => 0,
'byline' => 0,
'portrait' => 0,
);
$params = array_merge($defaults, $params);
$query = empty($params) ? '' : '?' . http_build_query($params);
return "//player.vimeo.com/video/{$id}{$query}";
}
すべての形式のYouTubeURLと一致する必要があります。使用例:
$url = "https://www.youtube.com/watch?v=buNGJm_s0XE";
$id = video_id_from_youtube_url($url); // buNGJm_s0XE
$url = "http://youtu.be/buNGJm_s0XE";
$id = video_id_from_youtube_url($url); // buNGJm_s0XE
$fmt_url = youtube_video_url_with_id($id);
またはVimeoのURL:
$id = video_id_from_vimeo_url('https://vimeo.com/ondemand/afilmaboutcoffee/112360104'); // 112360104
$id = video_id_from_vimeo_url('https://vimeo.com/112360104'); // 112360104
これらの関数と正規表現を組み合わせて正しいフォーマッターに一致させ、すばらしいビデオを出力します。最近のEmberアプリには、URLの変更を監視し、HTML出力を更新してビデオのプレビューを表示するJavascriptコンポーネントがあります。PHPバージョンと同じ正規表現を使用します。このようなもの(coffeescript):
YOUTUBE_EXPR = /^(?:(?:(?:https?:)?\/\/)?(?:www\.)?(?:youtu(?:be\.com|\.be))\/(?:watch\?v\=|v\/|embed\/)?([\w\-]+))/i
VIMEO_EXPR = /^(?:(?:https?:\/\/)?(?:www\.)?vimeo\.com.*\/([\w\-]+))/i