0

私はphpが初めてです。

有効な YouTube URL と、動画が存在するかどうかを確認したい。

任意の提案をいただければ幸いです。

4

4 に答える 4

4

これが私が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 ';

?>
于 2013-03-04T07:46:54.397 に答える
3

preg_matchドキュメントを読んだことがありませんよね?

  • 区切りが必要です。/が最も一般的ですが、URL を扱う#ため、多少のエスケープが回避されるため簡単です。
  • ?またはなどの正規表現で特別な意味を持つ文字をエスケープする必要があります.
  • 一致は返されません (一致の数を返すか、失敗した場合は false を返します)。したがって、一致した文字列を取得するには、次の 3 番目のパラメーターが必要です。preg_match

 

preg_match('#https?://(?:www\.)?youtube\.com/watch\?v=([^&]+?)#', $videoUrl, $matches);
于 2012-05-03T06:27:20.703 に答える
2

@ThiefMasterが言ったように、

しかし、私は何かを追加したいと思います。

彼は、ビデオが存在するかどうかを判断する方法を尋ねました。

curl リクエストを実行してから実行curl_getinfo(...)し、http ステータス コードを確認します。

200 の場合、ビデオは存在し、それ以外の場合は存在しません。

仕組みについては、こちらをお読みください: curl_getinfo

于 2012-05-03T06:44:58.910 に答える
2

上記の答えを少し変更する必要があります。そうしないと、最初の文字を取得しただけです。

これを試して

<?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"
//}
于 2012-05-03T06:46:15.857 に答える