Es raro... yo copié tu código tal cual y me funciona bien con todas las opciones que propones. Excepto con la de substr() que debería tener como parámetro $url[8] y no $url.
Te aconsejaría que utilices nombres diferentes de variables. Sobretodo si $url primero es una cadena que entra como parámetro, luego otra cadena distinta, luego un array (get_headers) y luego una simple cadena otra vez. Esto no tiene nada que ver, pero es por una cuestión de orden.
Además, de todas las opciones, creo que la mejor es directamente cortar la cadena con substr, que no hace comparaciones de ningún tipo.
Haz un archivo prueba.php que solamente contenga esto:
Código PHP:
<?php
error_reporting(E_ALL);
function getYouTubeFlv($url){
if( $html = file_get_contents($url) ){
if( preg_match_all("/\b(?:video_id)\b:.*/", $html, $matches) ){
$ref = $matches[0][0];
preg_match_all("/\'[^\'\\\\\r\n]*(?:\\\\.[^\'\\\\\r\n]*)*\'/", $ref, $match);
$id1 = str_replace("'", "", $match[0][0]);
$id2 = str_replace("'", "", $match[0][2]);
$id3 = str_replace("'", "", $match[0][3]);
$id = $id1.'&t='.$id2.'&sk='.$id3;
$url_video = 'http://youtube.com/get_video.php?video_id='.$id;
$url_headers = get_headers($url_video);
$url_flv = substr( $url_headers[8],10 );
return $url_flv;
}
return false;
}
}
// Probando la función
if( $flv = getYouTubeFlv("http://es.youtube.com/watch?v=cGa4vGJ2O7w") ){
echo $flv;
}
?>
Solamente le cambié el nombre a algunas variables para que se entiendan mejor y dejé el substr(). Con el error_reporting() nos aseguramos de que te aparezcan los mensajes de error.
Simplemente recuerda que
get_headers() está disponible desde PHP5.
Saludos