私はphpが初めてです。
有効な YouTube URL と、動画が存在するかどうかを確認したい。
任意の提案をいただければ幸いです。
これが私がYoutubeのoembedを使って書いた解決策です。
最初の関数は、ビデオがYoutubeのサーバーに存在するかどうかをチェックするだけです。404エラーが返された場合にのみ、ビデオが存在しないことを前提としています。401(無許可)は、ビデオが存在することを意味しますが、いくつかのアクセス制限があります(たとえば、埋め込みが無効になっている可能性があります)。
ビデオが存在し、埋め込み可能かどうかを確認する場合は、2番目の関数を使用します。
<?php
function isValidYoutubeURL($url) {
// Let's check the host first
$parse = parse_url($url);
$host = $parse['host'];
if (!in_array($host, array('youtube.com', 'www.youtube.com'))) {
return false;
}
$ch = curl_init();
$oembedURL = 'www.youtube.com/oembed?url=' . urlencode($url).'&format=json';
curl_setopt($ch, CURLOPT_URL, $oembedURL);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// Silent CURL execution
$output = curl_exec($ch);
unset($output);
$info = curl_getinfo($ch);
curl_close($ch);
if ($info['http_code'] !== 404)
return true;
else
return false;
}
function isEmbeddableYoutubeURL($url) {
// Let's check the host first
$parse = parse_url($url);
$host = $parse['host'];
if (!in_array($host, array('youtube.com', 'www.youtube.com'))) {
return false;
}
$ch = curl_init();
$oembedURL = 'www.youtube.com/oembed?url=' . urlencode($url).'&format=json';
curl_setopt($ch, CURLOPT_URL, $oembedURL);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
$data = json_decode($output);
if (!$data) return false; // Either 404 or 401 (Unauthorized)
if (!$data->{'html'}) return false; // Embeddable video MUST have 'html' provided
return true;
}
$url = 'http://www.youtube.com/watch?v=QH2-TGUlwu4';
echo isValidYoutubeURL($url) ? 'Valid, ': 'Not Valid, ';
echo isEmbeddableYoutubeURL($url) ? 'Embeddable ': 'Not Embeddable ';
?>
preg_match
ドキュメントを読んだことがありませんよね?
/
が最も一般的ですが、URL を扱う#
ため、多少のエスケープが回避されるため簡単です。?
またはなどの正規表現で特別な意味を持つ文字をエスケープする必要があります.
preg_match
preg_match('#https?://(?:www\.)?youtube\.com/watch\?v=([^&]+?)#', $videoUrl, $matches);
@ThiefMasterが言ったように、
しかし、私は何かを追加したいと思います。
彼は、ビデオが存在するかどうかを判断する方法を尋ねました。
curl リクエストを実行してから実行curl_getinfo(...)
し、http ステータス コードを確認します。
200 の場合、ビデオは存在し、それ以外の場合は存在しません。
仕組みについては、こちらをお読みください: curl_getinfo
上記の答えを少し変更する必要があります。そうしないと、最初の文字を取得しただけです。
これを試して
<?php
$videoUrl = 'http://www.youtube.com/watch?v=cKO6GrbdXfU&feature=g-logo';
preg_match('%https?://(?:www\.)?youtube\.com/watch\?v=([^&]+)%', $videoUrl, $matches);
var_dump($matches);
//array(2) {
// [0]=>
// string(42) "http://www.youtube.com/watch?v=cKO6GrbdXfU"
// [1]=>
// string(11) "cKO6GrbdXfU"
//}