PHP Regex para obtener la identificación de video de YouTube?

137

¿Alguien puede mostrarme cómo obtener la identificación de YouTube de una URL independientemente de qué otras variables GET están en la URL?

Use este video, por ejemplo: http://www.youtube.com/watch?v=C4kxS1ksqtw&feature=related
Entonces, entre v=y antes del siguiente&

Wesbos
fuente
1
Eso podría ser útil stackoverflow.com/questions/9522868/…
1
Debes mirar mi código github.com/lingtalfi/video-ids-and-thumbnails/blob/master/… , proporciono funciones que extraen la identificación de youtube, vimeo y dailymotion.
ling
@ling en la función getVideoThumbnailByUrl () estabas usando el file_get_contents () en desuso para Vimeo. Este reemplazo funcionará en todas partes:$ch=curl_init(); curl_setopt($ch, CURLOPT_URL, "http://vimeo.com/api/v2/video/$id.php"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); $hash =unserialize(curl_exec($ch)); curl_close($ch);
jerrygarciuh
@ling También en getYoutubeId ($ url) el condicional final aceptará cualquier cadena y la validará como ID de YT. Lo pasé 'basura' y devolvió basura como una identificación analizada desde esa cadena.
jerrygarciuh
@jerrygarciuh: afaik file_get_contents no está en desuso, no dude en informar un problema en github si tuvo problemas con esta función. Gracias por detectar el error en getYoutubeId (lo mejoré).
ling

Respuestas:

304

Use parse_url () y parse_str () .

(Puedes usar expresiones regulares para casi cualquier cosa, pero es muy fácil cometer un error, así que si hay funciones PHP específicamente para lo que estás tratando de lograr, úsalas).

parse_url toma una cadena y la corta en una matriz que tiene un montón de información. Puede trabajar con esta matriz o puede especificar el elemento que desea como segundo argumento. En este caso estamos interesados ​​en la consulta, que es PHP_URL_QUERY.

Ahora tenemos la consulta, que es v=C4kxS1ksqtw&feature=relate, pero solo queremos la parte posterior v=. Para esto pasamos a lo parse_strque básicamente funciona como GETen una cadena. Toma una cadena y crea las variables especificadas en la cadena. En este caso $vy $featurese crea. Solo nos interesa $v.

Para estar seguro, no solo desea almacenar todas las variables del parse_urlen su espacio de nombres (vea el comentario de mellowsoon). En su lugar, almacene las variables como elementos de una matriz, de modo que tenga control sobre qué variables está almacenando y no pueda sobrescribir accidentalmente una variable existente.

Poniendo todo junto, tenemos:

<?php
$url = "http://www.youtube.com/watch?v=C4kxS1ksqtw&feature=relate";
parse_str( parse_url( $url, PHP_URL_QUERY ), $my_array_of_vars );
echo $my_array_of_vars['v'];    
  // Output: C4kxS1ksqtw
?> 

Ejemplo de trabajo


Editar:

jeje - gracias Charles. Eso me hizo reír, nunca antes había visto la cita de Zawinski:

Some people, when confronted with a problem, think ‘I know, I’ll use regular expressions.’ Now they have two problems. - Jamie Zawinski

Peter Ajtai
fuente
1
Aunque no usa expresiones regulares (al menos visiblemente, no estoy seguro de cómo parse_url()funciona bajo el capó), este es el camino a seguir.
Thomas Owens
11
<Insertar cita de Zawinski aquí>. Aunque con toda seriedad, el uso de funciones de lenguaje para realizar una tarea con frecuencia será mejor que el salto de aro que puede requerir una buena expresión regular.
Charles
1
Solo sugeriría usar el segundo parámetro de parse_str () para almacenar los parámetros de consulta en una matriz. Tener variables que aparecen mágicamente de la nada nunca es una buena idea.
mellowsoon
2
Un ejemplo simple y rápido de por qué usar las "variables mágicas" de parse_str () no es una buena idea -> pastebin.com/AtaaPH4r
mellowsoon
1
@Qualcuno, por supuesto que no. Esto es específicamente para recuperar "obtener variables", según el OP. Sus ejemplos no son obtener variables.
Peter Ajtai
154
preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#", $url, $matches);

Esto explicará

youtube.com/v/{vidid}
youtube.com/vi/{vidid}
youtube.com/?v={vidid}
youtube.com/?vi={vidid}
youtube.com/watch?v={vidid}
youtube.com/watch?vi={vidid}
youtu.be/{vidid}

Lo mejoré un poco para admitir: http://www.youtube.com/v/5xADESocujo?feature=autoshare&version=3&autohide=1&autoplay=1

La línea que uso ahora es:

preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+(?=\?)|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#", $link, $matches);
Anthony Leach
fuente
3
Lo actualicé para que también maneje URL como esta: youtube.com/embed/7zuAOomfiCc #(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+(?=\?)|(?<=embed/)[^&\n]+|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#
simonbs
11
Esto funciona para todas las URL, inc. Cadenas incrustadas (?<=(?:v|i)=)[a-zA-Z0-9-]+(?=&)|(?<=(?:v|i)\/)[^&\n]+|(?<=embed\/)[^"&\n]+|(?<=(?:v|i)=)[^&\n]+|(?<=youtu.be\/)[^&\n]+ rubular.com/r/M9PJYcQxRW
Rob
3
¿qué tal esto /(youtu\.be\/|youtube\.com\/(watch\?(.*&)?v=|(embed|v|user)\/))([^\?& "' >] +) /
bokor
2
En realidad, el código de @ bokor llena la $matchesmatriz con más información, incluida la identificación de video que fue muy útil para mi proyecto
cronoklee
2
Además de la expresión regular de Rob, y la lista también fue capturada. Esto se elimina en la expresión regular a continuación: # (? <= (?: v | i) =) [a-zA-Z0-9 -_] + | (? <= (?: v | i) \ /) [^ &? \ n] + | (? <= incrustar \ /) [^ "&? \ n] + | (? <= ‌ (?: v | i) =) [^ &? \ n] + | (? <= youtu.be \ /) [^ &? \ n] + # Ahora compatible: youtu.be/RRyG_mtYieI?list=PLnBXpb1YLPttKF7RZX64qI_AEyFjTvgtx youtube.com/… ‌ _AEyFjTvgtx //www.youtube.com/emb/ RRyG_mtYieI? List = PLnBXpb1YLPttKF7RZX64qI_AEyFjTvgtx youtube.com/v/RRyG_mtYieI
Rick de Graaf
100

Basado en el comentario de bokor sobre la respuesta de Anthony:

preg_match("/^(?:http(?:s)?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user)\/))([^\?&\"'>]+)/", $url, $matches);

$matches[1] contiene el vidid

Partidos:

No coincide:

  • www.facebook.com?wtv=youtube.com/v/vidid
Shawn
fuente
¿Tiene una versión C / objc / c ++ de esta cadena? No sé de qué partes escapar.
João Nunes
Intenté: "^ (?: Http (?: S)?: //)? (?: Www \\.)? (?: Youtu \\. Be / | youtube \\. Com / (? :(? : ver)? \? (?:. * &)? v (?: i)? = | (?: incrustar | v | vi | usuario) /)) ([^ \? & \ "'>] +) "No pasa todos tus ejemplos
João Nunes
1
Encontré mi problema. aquí está la cadena c final: "^ (?: http (?: s)?: //)? (?: www \\.)? (?: youtu \\. be / | youtube \\. com / (? :( ?: ver)? \\? (?:. * &)? v (?: i)? = | (?: incrustar | v | vi | usuario) /)) ([^ \? & \ "'>] +)"
João Nunes
Para tener en cuenta también las URL como youtube.com/watch?v=vidid#action=share , agregué el #grupo de captura final:preg_match("/^(?:http(?:s)?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user)\/))([^\?#&\"'>]+)/", $url, $matches);
joshangell
1
Agrega contenido con espacio y toma todo el texto después de una url en una página. Esto es mejor / (?: http (?: S)?: \ / \ /)? (?: www \.)? (?: m \.)? (?: youtu \ .be \ / | youtube \. com \ / (? :( ?: watch)? \? (?:. * &)? v (?: i)? = | (?: embed | v | vi | user) \ /)) ([a- zA-Z0-9 \ -_] *) /
Gino
36

Esto se puede lograr muy fácilmente usando parse_str y parse_url y es más confiable en mi opinión.

Mi función admite las siguientes URL:

También incluye la prueba debajo de la función.

/**
 * Get Youtube video ID from URL
 *
 * @param string $url
 * @return mixed Youtube video ID or FALSE if not found
 */
function getYoutubeIdFromUrl($url) {
    $parts = parse_url($url);
    if(isset($parts['query'])){
        parse_str($parts['query'], $qs);
        if(isset($qs['v'])){
            return $qs['v'];
        }else if(isset($qs['vi'])){
            return $qs['vi'];
        }
    }
    if(isset($parts['path'])){
        $path = explode('/', trim($parts['path'], '/'));
        return $path[count($path)-1];
    }
    return false;
}
// Test
$urls = array(
    'http://youtube.com/v/dQw4w9WgXcQ?feature=youtube_gdata_player',
    'http://youtube.com/vi/dQw4w9WgXcQ?feature=youtube_gdata_player',
    'http://youtube.com/?v=dQw4w9WgXcQ&feature=youtube_gdata_player',
    'http://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player',
    'http://youtube.com/?vi=dQw4w9WgXcQ&feature=youtube_gdata_player',
    'http://youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player',
    'http://youtube.com/watch?vi=dQw4w9WgXcQ&feature=youtube_gdata_player',
    'http://youtu.be/dQw4w9WgXcQ?feature=youtube_gdata_player'
);
foreach($urls as $url){
    echo $url . ' : ' . getYoutubeIdFromUrl($url) . "\n";
}
Kus
fuente
Esto es realmente genial y también funciona para videos vimeo
Chris James Champeau
1
Esta es también mi respuesta preferida. Cubre tanto YouTube como Vimeo. Una nota, agregué un ajuste súper menor con un isset adicional (), si no (isset ($ qs ['vi'])). Muchas gracias por esto
Spedley
23

SOLUCION Para cualquier tipo de enlace !! :

<?php
function get_youtube_id_from_url($url)  {
     preg_match('/(http(s|):|)\/\/(www\.|)yout(.*?)\/(embed\/|watch.*?v=|)([a-z_A-Z0-9\-]{11})/i', $url, $results);    return $results[6];
}


echo get_youtube_id_from_url('http://www.youtube.com/watch?var1=blabla#v=GvJehZx3eQ1$var2=bla');
      // or                   http://youtu.be/GvJehZx3eQ1 
      // or                   http://www.youtube.com/embed/GvJehZx3eQ1
      // or                   http://www.youtu.be/GvJehZx3eQ1/blabla?xyz
?>

salidas: GvJehZx3eQ1

T.Todua
fuente
13

arreglado basado en ¿Cómo validar identificadores de video de YouTube?

<?php

$links = [
    "youtube.com/v/tFad5gHoBjY",
    "youtube.com/vi/tFad5gHoBjY",
    "youtube.com/?v=tFad5gHoBjY",
    "youtube.com/?vi=tFad5gHoBjY",
    "youtube.com/watch?v=tFad5gHoBjY",
    "youtube.com/watch?vi=tFad5gHoBjY",
    "youtu.be/tFad5gHoBjY",
    "http://youtu.be/qokEYBNWA_0?t=30m26s",
    "youtube.com/v/vidid",
    "youtube.com/vi/vidid",
    "youtube.com/?v=vidid",
    "youtube.com/?vi=vidid",
    "youtube.com/watch?v=vidid",
    "youtube.com/watch?vi=vidid",
    "youtu.be/vidid",
    "youtube.com/embed/vidid",
    "http://youtube.com/v/vidid",
    "http://www.youtube.com/v/vidid",
    "https://www.youtube.com/v/vidid",
    "youtube.com/watch?v=vidid&wtv=wtv",
    "http://www.youtube.com/watch?dev=inprogress&v=vidid&feature=related",
    "youtube.com/watch?v=7HCZvhRAk-M"
];

foreach($links as $link){
    preg_match("#([\/|\?|&]vi?[\/|=]|youtu\.be\/|embed\/)([a-zA-Z0-9_-]+)#", $link, $matches);
    var_dump(end($matches));
}
lleitep3
fuente
9

Sabemos que la identificación del video tiene una longitud de 11 caracteres y puede estar precedida por v=o vi=o v/o vi/o youtu.be/. Entonces, la forma más simple de hacer esto:

<?php
$youtube = 'http://youtube.com/v/dQw4w9WgXcQ?feature=youtube_gdata_player
http://youtube.com/vi/dQw4w9WgXcQ?feature=youtube_gdata_player
http://youtube.com/?v=dQw4w9WgXcQ&feature=youtube_gdata_player
http://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player
http://youtube.com/?vi=dQw4w9WgXcQ&feature=youtube_gdata_player
http://youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player
http://youtube.com/watch?vi=dQw4w9WgXcQ&feature=youtube_gdata_player
http://youtu.be/dQw4w9WgXcQ?feature=youtube_gdata_player';

preg_match_all("#(?<=v=|v\/|vi=|vi\/|youtu.be\/)[a-zA-Z0-9_-]{11}#", $youtube, $matches);

var_dump($matches[0]);

Y salida:

array(8) {
  [0]=>
  string(11) "dQw4w9WgXcQ"
  [1]=>
  string(11) "dQw4w9WgXcQ"
  [2]=>
  string(11) "dQw4w9WgXcQ"
  [3]=>
  string(11) "dQw4w9WgXcQ"
  [4]=>
  string(11) "dQw4w9WgXcQ"
  [5]=>
  string(11) "dQw4w9WgXcQ"
  [6]=>
  string(11) "dQw4w9WgXcQ"
  [7]=>
  string(11) "dQw4w9WgXcQ"
}
Krzysiek
fuente
9

Lo siguiente funcionará para todos los enlaces de youtube

<?php
    // Here is a sample of the URLs this regex matches: (there can be more content after the given URL that will be ignored)
    // http://youtu.be/dQw4w9WgXcQ
    // http://www.youtube.com/embed/dQw4w9WgXcQ
    // http://www.youtube.com/watch?v=dQw4w9WgXcQ
    // http://www.youtube.com/?v=dQw4w9WgXcQ
    // http://www.youtube.com/v/dQw4w9WgXcQ
    // http://www.youtube.com/e/dQw4w9WgXcQ
    // http://www.youtube.com/user/username#p/u/11/dQw4w9WgXcQ
    // http://www.youtube.com/sandalsResorts#p/c/54B8C800269D7C1B/0/dQw4w9WgXcQ
    // http://www.youtube.com/watch?feature=player_embedded&v=dQw4w9WgXcQ
    // http://www.youtube.com/?feature=player_embedded&v=dQw4w9WgXcQ
    // It also works on the youtube-nocookie.com URL with the same above options.
    // It will also pull the ID from the URL in an embed code (both iframe and object tags)

$url = "https://www.youtube.com/watch?v=v2_MLFVdlQM";

    preg_match('%(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i', $url, $match);

    $youtube_id = $match[1];

echo $youtube_id;
    ?>
John Max
fuente
4
if (preg_match('![?&]{1}v=([^&]+)!', $url . '&', $m))
    $video_id = $m[1];
NullUserException
fuente
Gracias, esto funcionó bien para mí ya que quería todos los dominios, http y https, y cualquier otro tipo de basura en la url.
MakuraYami
4
(?<=\?v=)([a-zA-Z0-9_-]){11}

Esto debería hacerlo también.

kyri
fuente
4

Tenía algo de contenido de publicación que tuve que cifrar para obtener la identificación de Youtube. Sucedió que tenía la forma del <iframe>código de inserción que proporciona YouTube.

 <iframe src="http://www.youtube.com/embed/Zpk8pMz_Kgw?rel=0" frameborder="0" width="620" height="360"></iframe>

El siguiente patrón que obtuve de @rob arriba. El fragmento hace un foreachbucle una vez que se encuentran las coincidencias, y para una ventaja adicional, lo vinculé a la imagen de vista previa que se encuentra en Youtube. Potencialmente podría coincidir con más tipos de URL y tipos de inserción de Youtube:

$pattern = '#(?<=(?:v|i)=)[a-zA-Z0-9-]+(?=&)|(?<=(?:v|i)\/)[^&\n]+|(?<=embed\/)[^"&\n]+|(?<=‌​(?:v|i)=)[^&\n]+|(?<=youtu.be\/)[^&\n]+#';

preg_match_all($pattern, $post_content, $matches);

foreach ($matches as $match) {
    $img = "<img src='http://img.youtube.com/vi/".str_replace('?rel=0','', $match[0])."/0.jpg' />";
    break;
}

Perfil de Rob: https://stackoverflow.com/users/149615/rob

Foxinni
fuente
4

Para extraer el iden un grupo de captura, la siguiente expresión o alguna derivada de eso también podría ser una opción:

(?im)\b(?:https?:\/\/)?(?:w{3}\.)?youtu(?:be)?\.(?:com|be)\/(?:(?:\??v=?i?=?\/?)|watch\?vi?=|watch\?.*?&v=|embed\/|)([A-Z0-9_-]{11})\S*(?=\s|$)

Manifestación

Prueba

$re = '/(?im)\b(?:https?:\/\/)?(?:w{3}\.)?youtu(?:be)?\.(?:com|be)\/(?:(?:\??v=?i?=?\/?)|watch\?vi?=|watch\?.*?&v=|embed\/|)([A-Z0-9_-]{11})\S*(?=\s|$)/';
$str = 'http://youtube.com/v/tFad5gHoBjY
https://youtube.com/vi/tFad5gHoBjY
http://www.youtube.com/?v=tFad5gHoBjY
http://www.youtube.com/?vi=tFad5gHoBjY
https://www.youtube.com/watch?v=tFad5gHoBjY
youtube.com/watch?vi=tFad5gHoBjY
youtu.be/tFad5gHoBjY
http://youtu.be/qokEYBNWA_0?t=30m26s
youtube.com/v/7HCZvhRAk-M
youtube.com/vi/7HCZvhRAk-M
youtube.com/?v=7HCZvhRAk-M
youtube.com/?vi=7HCZvhRAk-M
youtube.com/watch?v=7HCZvhRAk-M
youtube.com/watch?vi=7HCZvhRAk-M
youtu.be/7HCZvhRAk-M
youtube.com/embed/7HCZvhRAk-M
http://youtube.com/v/7HCZvhRAk-M
http://www.youtube.com/v/7HCZvhRAk-M
https://www.youtube.com/v/7HCZvhRAk-M
youtube.com/watch?v=7HCZvhRAk-M&wtv=wtv
http://www.youtube.com/watch?dev=inprogress&v=7HCZvhRAk-M&feature=related
youtube.com/watch?v=7HCZvhRAk-M
http://youtube.com/v/dQw4w9WgXcQ?feature=youtube_gdata_player
http://youtube.com/vi/dQw4w9WgXcQ?feature=youtube_gdata_player
http://youtube.com/?v=dQw4w9WgXcQ&feature=youtube_gdata_player
http://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player
http://youtube.com/?vi=dQw4w9WgXcQ&feature=youtube_gdata_player
http://youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player
http://youtube.com/watch?vi=dQw4w9WgXcQ&feature=youtube_gdata_player
http://youtu.be/dQw4w9WgXcQ?feature=youtube_gdata_player';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

var_dump($matches);

Salida

array(30) {
  [0]=>
  array(2) {
    [0]=>
    string(32) "http://youtube.com/v/tFad5gHoBjY"
    [1]=>
    string(11) "tFad5gHoBjY"
  }
  [1]=>
  array(2) {
    [0]=>
    string(34) "https://youtube.com/vi/tFad5gHoBjY"
    [1]=>
    string(11) "tFad5gHoBjY"
  }
  [2]=>
  array(2) {
    [0]=>
    string(37) "http://www.youtube.com/?v=tFad5gHoBjY"
    [1]=>
    string(11) "tFad5gHoBjY"
  }
  [3]=>
  array(2) {
    [0]=>
    string(38) "http://www.youtube.com/?vi=tFad5gHoBjY"
    [1]=>
    string(11) "tFad5gHoBjY"
  }
  [4]=>
  array(2) {
    [0]=>
    string(43) "https://www.youtube.com/watch?v=tFad5gHoBjY"
    [1]=>
    string(11) "tFad5gHoBjY"
  }
  [5]=>
  array(2) {
    [0]=>
    string(32) "youtube.com/watch?vi=tFad5gHoBjY"
    [1]=>
    string(11) "tFad5gHoBjY"
  }
  [6]=>
  array(2) {
    [0]=>
    string(20) "youtu.be/tFad5gHoBjY"
    [1]=>
    string(11) "tFad5gHoBjY"
  }
  [7]=>
  array(2) {
    [0]=>
    string(27) "http://youtu.be/qokEYBNWA_0"
    [1]=>
    string(11) "qokEYBNWA_0"
  }
  [8]=>
  array(2) {
    [0]=>
    string(25) "youtube.com/v/7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [9]=>
  array(2) {
    [0]=>
    string(26) "youtube.com/vi/7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [10]=>
  array(2) {
    [0]=>
    string(26) "youtube.com/?v=7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [11]=>
  array(2) {
    [0]=>
    string(27) "youtube.com/?vi=7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [12]=>
  array(2) {
    [0]=>
    string(31) "youtube.com/watch?v=7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [13]=>
  array(2) {
    [0]=>
    string(32) "youtube.com/watch?vi=7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [14]=>
  array(2) {
    [0]=>
    string(20) "youtu.be/7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [15]=>
  array(2) {
    [0]=>
    string(29) "youtube.com/embed/7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [16]=>
  array(2) {
    [0]=>
    string(32) "http://youtube.com/v/7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [17]=>
  array(2) {
    [0]=>
    string(36) "http://www.youtube.com/v/7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [18]=>
  array(2) {
    [0]=>
    string(37) "https://www.youtube.com/v/7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [19]=>
  array(2) {
    [0]=>
    string(31) "youtube.com/watch?v=7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [20]=>
  array(2) {
    [0]=>
    string(57) "http://www.youtube.com/watch?dev=inprogress&v=7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [21]=>
  array(2) {
    [0]=>
    string(31) "youtube.com/watch?v=7HCZvhRAk-M"
    [1]=>
    string(11) "7HCZvhRAk-M"
  }
  [22]=>
  array(2) {
    [0]=>
    string(32) "http://youtube.com/v/dQw4w9WgXcQ"
    [1]=>
    string(11) "dQw4w9WgXcQ"
  }
  [23]=>
  array(2) {
    [0]=>
    string(33) "http://youtube.com/vi/dQw4w9WgXcQ"
    [1]=>
    string(11) "dQw4w9WgXcQ"
  }
  [24]=>
  array(2) {
    [0]=>
    string(33) "http://youtube.com/?v=dQw4w9WgXcQ"
    [1]=>
    string(11) "dQw4w9WgXcQ"
  }
  [25]=>
  array(2) {
    [0]=>
    string(42) "http://www.youtube.com/watch?v=dQw4w9WgXcQ"
    [1]=>
    string(11) "dQw4w9WgXcQ"
  }
  [26]=>
  array(2) {
    [0]=>
    string(34) "http://youtube.com/?vi=dQw4w9WgXcQ"
    [1]=>
    string(11) "dQw4w9WgXcQ"
  }
  [27]=>
  array(2) {
    [0]=>
    string(38) "http://youtube.com/watch?v=dQw4w9WgXcQ"
    [1]=>
    string(11) "dQw4w9WgXcQ"
  }
  [28]=>
  array(2) {
    [0]=>
    string(39) "http://youtube.com/watch?vi=dQw4w9WgXcQ"
    [1]=>
    string(11) "dQw4w9WgXcQ"
  }
  [29]=>
  array(2) {
    [0]=>
    string(27) "http://youtu.be/dQw4w9WgXcQ"
    [1]=>
    string(11) "dQw4w9WgXcQ"
  }
}

Si desea simplificar / modificar / explorar la expresión, se explica en el panel superior derecho de regex101.com . Si lo desea, también puede ver en este enlace cómo coincidiría con algunas entradas de muestra.


Circuito RegEx

jex.im visualiza expresiones regulares:

ingrese la descripción de la imagen aquí


Emma
fuente
2
$vid = preg_replace('/^.*(\?|\&)v\=/', '', $url);  // Strip all meuk before and including '?v=' or '&v='.

$vid = preg_replace('/[^\w\-\_].*$/', '', $vid);  // Strip trailing meuk.
pieter
fuente
2

Sé que el título del hilo se refiere al uso de una expresión regular, pero tal como dice la cita de Zawinski, realmente creo que evitar las expresiones regulares es mejor aquí. Recomendaría esta función en su lugar:

function get_youtube_id($url)
{
    if (strpos( $url,"v=") !== false)
    {
        return substr($url, strpos($url, "v=") + 2, 11);
    }
    elseif(strpos( $url,"embed/") !== false)
    {
        return substr($url, strpos($url, "embed/") + 6, 11);
    }

}

Recomiendo esto porque la identificación de los videos de YouTube es siempre la misma, independientemente del estilo de la URL, por ejemplo

  • http://www.youtube.com/watch?v=t_uW44Bsezg
  • http://www.youtube.com/watch?feature=endscreen&v=Id3xG4xnOfA&NR=1
  • ¡¡¡Y otra forma de Ulr en la que se coloca la palabra "incrustar /" antes de la Id ... !!

y ese podría ser el caso de las iframecosas incrustadas y con relleno.

DreamLordOneiros
fuente
0

Acabo de encontrar esto en línea en http://snipplr.com/view/62238/get-youtube-video-id-very-robust/

function getYouTubeId($url) {
// Format all domains to http://domain for easier URL parsing
str_replace('https://', 'http://', $url);
if (!stristr($url, 'http://') && (strlen($url) != 11)) {
    $url = 'http://' . $url;
}
$url = str_replace('http://www.', 'http://', $url);

if (strlen($url) == 11) {
    $code = $url;
} else if (preg_match('/http:\/\/youtu.be/', $url)) {
    $url = parse_url($url, PHP_URL_PATH);
    $code = substr($url, 1, 11);
} else if (preg_match('/watch/', $url)) {
    $arr = parse_url($url);
    parse_str($url);
    $code = isset($v) ? substr($v, 0, 11) : false;
} else if (preg_match('/http:\/\/youtube.com\/v/', $url)) {
    $url = parse_url($url, PHP_URL_PATH);
    $code = substr($url, 3, 11);
} else if (preg_match('/http:\/\/youtube.com\/embed/', $url, $matches)) {
    $url = parse_url($url, PHP_URL_PATH);
    $code = substr($url, 7, 11);
} else if (preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+#", $url, $matches) ) {
    $code = substr($matches[0], 0, 11);
} else {
    $code = false;
}

if ($code && (strlen($code) < 11)) {
    $code = false;
}

return $code;
}
marcnyc
fuente
0

Usé los datos de la respuesta de Shawn, pero generalicé y acorté un poco la expresión regular. La diferencia clave con este es que no probará una URL de Youtube válida, solo buscará una identificación de video. Lo que significa que todavía devolverá una identificación de video para www.facebook.com?wtv=youtube.com/v/vidid. Funciona para todos los casos de prueba, pero es un poco más laxo. En consecuencia, generará un falso positivo para algo así https://www.twitter.com/watch?v=vidid. Use este método si los datos son super inconsistentes, de lo contrario use una expresión regular más específica o parse_url()y parse_str().

preg_match("/([\?&\/]vi?|embed|\.be)[\/=]([\w-]+)/",$url,$matches);
print($matches[2]);
Syd Lambert
fuente
0

Creo que estás intentando hacer esto.

<?php
  $video = 'https://www.youtube.com/watch?v=u00FY9vADfQ';
  $parsed_video = parse_url($video, PHP_URL_QUERY);
  parse_str($parsed_video, $arr);
?>
<iframe
src="https://www.youtube.com/embed/<?php echo $arr['v'];  ?>"
frameborder="0">
</iframe>
Wael Assaf
fuente
0

¿Y si quiero extraer una URL de youtue de una cadena llena de otros caracteres? Me gusta esto:

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco https://www.youtube.com/watch?v=cPW9Y94BJI0 laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepcional sint occasionecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

y obtener https://www.youtube.com/watch?v=cPW9Y94BJI0 de esa cadena?

Guillermo Esquivel
fuente
0

Usa este código:

$url = "http://www.youtube.com/watch?v=C4kxS1ksqtw&feature=related"; 
$parse = parse_url($url, PHP_URL_QUERY); 
parse_str($parse, $output); 
echo $output['watch'];

resultado: C4kxS1ksqtw

dev devino
fuente