0

我是 php 新手。

我想检查有效的 youtube URL 以及视频是否存在。

任何建议将不胜感激。

4

4 回答 4

4

这是我使用 Youtube 的oembed编写的解决方案。

第一个函数只是检查视频是否存在于 Youtube 的服务器上。它假定仅当返回 404 错误时视频不存在。401(未授权)表示视频存在,但有一些访问限制(例如,嵌入可能被禁用)。

如果要检查视频是否存在并且是否可嵌入,请使用第二个功能。

<?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),因此要获取匹配的字符串,您需要第三个参数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 回答