php - 使用正则表达式在PHP中下载YouTube视频

标签 php regex curl download youtube

我正在使用以下代码下载youtube视频。

    <?php
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past

require_once('lib/youtube.lib.php');



if(preg_match('/youtube\.com/i',$_GET['url'])){

    if(!preg_match('/www\./i',$_GET['url'])){
        $_GET['url'] = str_replace('http://','http://www.',$_GET['url']);
    }
    list($video_id,$download_link) = get_youtube($_GET['url']);}

else{
    die('<span style="color:red;">Sorry, the URL is not recognized..</span>');
}

    ?>


    <p>
    <img src="http://img.youtube.com/vi/<?php echo trim($video_id);?>/1.jpg" alt="Preview 1" class="ythumb" />
    <img src="http://img.youtube.com/vi/<?php echo trim($video_id);?>/2.jpg" alt="Preview 2" class="ythumb" />
    <img src="http://img.youtube.com/vi/<?php echo trim($video_id);?>/3.jpg" alt="Preview 3" class="ythumb" />
    </p>
    <p>
    <a href="<?php echo trim($download_link);?>" class="ydl" title="Download as FLV">Download FLV</a>
    <a href="<?php echo trim($download_link);?>&fmt=35" class="ydl" title="Download as MP4">Download MP4</a>
    <a href="<?php echo trim($download_link);?>&fmt=17" class="ydl" title="Download as 3GP">Download 3GP</a>
    </p>

而我的ge_youtube函数包含在youtube.lib.php文件中。该文件包含代码。
     <?php



function get_content_of_url($url){
    $ohyeah = curl_init();
    curl_setopt($ohyeah, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ohyeah, CURLOPT_URL, $url);
    $data = curl_exec($ohyeah);
    curl_close($ohyeah);
    //print_r($data);
    return $data;
}


function get_flv_link($string) {  
if (preg_match('/watch_fullscreen(.*)plid/i', $string, $out)){


    if (!preg_match('/watch_fullscreen(.*)plid/i', $data, $out)) {  
    $outdata = $out[1];
      echo '1'.'<br>';
    $arrs = (explode('&',$outdata));
    foreach($arrs as $arr){
        list($i,$x) = explode("=",$arr);
        $$i = $x;
    }
    $link = 'http://www.youtube.com/get_video?video_id='.$video_id.'&t='.$t;
    echo '2';
    echo $link;
array($video_id,$link);
    return array($video_id,$link);
} 
}
}

function get_youtube($url){

    $stream = get_content_of_url($url);
 return get_flv_link($stream);
}



?>

输出对我来说非常有趣。在输出中没有显示错误。但我仍然一无所获。在代码中
> <a href="<?php echo trim($download_link);?>&fmt=17" class="ydl"
> title="Download as 3GP">Download 3GP</a>

在结果中显示,但链接指向本地主机。

看来我缺少一些技巧。让我告诉你,我在尝试学习php和curl时发现了这个脚本。
您有任何建议或帮助吗?您能帮我将这段代码转换为有效代码吗?

谢谢

最佳答案

问题不在于正则表达式,而是库对YouTube页面格式的假设。更换:

}

function get_youtube($url){


    else { echo "No match"; }
}

function get_youtube($url){

(它将else添加到if中的get_flv_link()中),您将收到一条消息,指出内容不匹配。这可能意味着YouTube更改了其页面格式(可能是因为人们试图像这样抓取它)。

另外,我对以下内容感到困惑:
if (preg_match('/watch_fullscreen(.*)plid/i', $string, $out)){
    if (!preg_match('/watch_fullscreen(.*)plid/i', $data, $out)) {

这就是说“如果匹配,则检查它是否与另一个变量不匹配(此时尚未声明)”。即使页面内容与预期内容匹配,您也可能需要在库中修复其他位。

关于php - 使用正则表达式在PHP中下载YouTube视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8977169/

相关文章:

php - 防止页面刷新时mysql查询

sql - 在列中查找所有但允许的字符

javascript - 正则表达式替换图像尺寸?

php - Stripe curl 命令行 POST

ruby-on-rails - 将 curl 命令转换为 httparty

php - Laravel Flysystem sftp 权限被拒绝

php - 跳过某些特定文件的 .htaccess 规则

php - OS X 上的 xdebug 部分工作(例如,在终端而不是浏览器中打印堆栈跟踪)。

regex - 如何从正则表达式子模式中排除一个单词?

bash - 来自 bash 脚本的错误状态值