PHP Regex pour obtenir l'ID vidéo YouTube?

137

Quelqu'un peut-il me montrer comment extraire l'identifiant YouTube d'une URL, quelles que soient les autres variables GET de l'URL.

Utilisez cette vidéo par exemple: http://www.youtube.com/watch?v=C4kxS1ksqtw&feature=related
Donc entre v=et avant le suivant&

wesbos
la source
1
Cela pourrait être utile stackoverflow.com/questions/9522868/…
1
Vous devriez regarder mon code github.com/lingtalfi/video-ids-and-thumbnails/blob/master/… , je propose des fonctions qui extraient l'identifiant de youtube, vimeo et dailymotion.
ling
@ling dans la fonction getVideoThumbnailByUrl () vous utilisiez le file_get_contents () obsolète pour Vimeo. Ce remplacement fonctionnera partout:$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 Toujours dans getYoutubeId ($ url), le conditionnel final acceptera n'importe quelle chaîne et la validera comme identifiant YT. Je l'ai passé "indésirable" et il a renvoyé des fichiers indésirables sous forme d'identifiant analysé à partir de cette chaîne.
jerrygarciuh
@jerrygarciuh: afaik file_get_contents n'est pas obsolète, n'hésitez pas à signaler un problème sur github si vous avez eu un problème avec cette fonction. Merci d'avoir repéré l'erreur dans getYoutubeId (je l'ai amélioré).
ling

Réponses:

304

Utilisez parse_url () et parse_str () .

(Vous pouvez utiliser des expressions régulières pour à peu près tout, mais il est très facile de faire une erreur, donc s'il existe des fonctions PHP spécifiquement pour ce que vous essayez d'accomplir, utilisez-les.)

parse_url prend une chaîne et la coupe en un tableau contenant un tas d'informations. Vous pouvez travailler avec ce tableau, ou vous pouvez spécifier l'élément que vous voulez comme deuxième argument. Dans ce cas, nous nous intéressons à la requête, qui est PHP_URL_QUERY.

Nous avons maintenant la requête, qui est v=C4kxS1ksqtw&feature=relate, mais nous ne voulons que la partie après v=. Pour cela, nous nous tournons vers parse_strce qui fonctionne essentiellement comme GETsur une chaîne. Il prend une chaîne et crée les variables spécifiées dans la chaîne. Dans ce cas $vet $featureest créé. Nous ne sommes intéressés que par $v.

Pour être sûr, vous ne voulez pas simplement stocker toutes les variables de parse_urldans votre espace de noms (voir le commentaire de mellowsoon). Stockez plutôt les variables en tant qu'éléments d'un tableau, de sorte que vous ayez le contrôle sur les variables que vous stockez et que vous ne puissiez pas accidentellement écraser une variable existante.

En mettant tout ensemble, nous avons:

<?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
?> 

Exemple de travail


Éditer:

hehe - merci Charles. Cela m'a fait rire, je n'ai jamais vu la citation de Zawinski auparavant:

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

Peter Ajtai
la source
1
Bien qu'il n'utilise pas de regex (du moins visiblement - je ne sais pas comment parse_url()fonctionne sous le capot), c'est la voie à suivre.
Thomas Owens
11
<Insérez la citation de Zawinski ici>. Bien que sérieusement, l'utilisation des fonctions de langage pour effectuer une tâche sera souvent meilleure que le saut en cerceau qu'une bonne regex peut exiger.
Charles
1
Je suggérerais seulement d'utiliser le deuxième paramètre de parse_str () pour stocker les paramètres de requête dans un tableau. Faire apparaître des variables comme par magie n'est jamais une bonne idée.
mellowsoon
2
Un exemple simple et rapide de la raison pour laquelle l'utilisation des "variables magiques" de parse_str () n'est pas une bonne idée -> pastebin.com/AtaaPH4r
mellowsoon
1
@Qualcuno - bien sûr que non. C'est spécifiquement pour récupérer "get variables" - par l'OP. Vos exemples ne sont pas des variables.
Peter Ajtai
154
preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#", $url, $matches);

Cela représentera

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}

Je l'ai légèrement amélioré pour prendre en charge: http://www.youtube.com/v/5xADESocujo?feature=autoshare&version=3&autohide=1&autoplay=1

La ligne que j'utilise maintenant est:

preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+(?=\?)|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#", $link, $matches);
Anthony Leach
la source
3
Je l'ai mis à jour pour gérer également les URL comme celle-ci: youtube.com/embed/7zuAOomfiCc #(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+(?=\?)|(?<=embed/)[^&\n]+|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#
simonbs
11
Cela fonctionne pour toutes les URL, y (?<=(?:v|i)=)[a-zA-Z0-9-]+(?=&)|(?<=(?:v|i)\/)[^&\n]+|(?<=embed\/)[^"&\n]+|(?<=(?:v|i)=)[^&\n]+|(?<=youtu.be\/)[^&\n]+ compris les
Rob
3
que diriez-vous de ceci /(youtu\.be\/|youtube\.com\/(watch\?(.*&)?v=|(embed|v|user)\/))([^\?& "' >] +) /
bokor
2
En fait, le code de @ bokor remplit le $matchestableau avec plus d'informations, y compris l'ID vidéo qui a été très utile pour mon projet
cronoklee
2
L'ajout à l'expression régulière de Rob, & list a également été capturé. Ceci est supprimé dans l'expression régulière ci-dessous: # (? <= (?: v | i) =) [a-zA-Z0-9 -_] + | (? <= (?: v | i) \ /) [^ &? \ n] + | (? <= incorporer \ /) [^ "&? \ n] + | (? <= ‌ (?: v | i) =) [^ &? \ n] + | (? <= youtu.be \ /) [^ &? \ n] + # Maintenant pris en charge: youtu.be/RRyG_mtYieI?list=PLnBXpb1YLPttKF7RZX64qI_AEyFjTvgtx youtube.com/… ‌ _AEyFjTvgtx //www.yembe/ RRyG_mtYieI? List = PLnBXpb1YLPttKF7RZX64qI_AEyFjTvgtx youtube.com/v/RRyG_mtYieI
Rick de Graaf
101

Basé sur le commentaire de Bokor sur la réponse d'Anthony:

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

$matches[1] contient le vidid

Allumettes:

Ne correspond pas:

  • www.facebook.com?wtv=youtube.com/v/vidid
Shawn
la source
Avez-vous une version C / objc / c ++ de cette chaîne? Je ne sais pas quelles parties échapper.
João Nunes le
J'ai essayé: "^ (?: Http (?: S)?: //)? (?: Www \\.)? (?: Youtu \\. Be / | youtube \\. Com / (? :(? : watch)? \? (?:. * &)? v (?: i)? = | (?: embarquer | v | vi | utilisateur) /)) ([^ \? & \ "'>] +) "Ne passant pas tous vos exemples
João Nunes
1
J'ai trouvé mon problème. ici c'est la dernière chaîne c: "^ (?: http (?: s)?: //)? (?: www \\.)? (?: youtu \\. be / | youtube \\. com / (? :( ?: regarder)? \\? (?:. * &)? v (?: i)? = | (?: incorporer | v | vi | utilisateur) /)) ([^ \? & \ "'>] +)"
João Nunes
Pour prendre également en compte les URL comme youtube.com/watch?v=vidid#action=share, j'ai ajouté le #au groupe de capture de fin:preg_match("/^(?:http(?:s)?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user)\/))([^\?#&\"'>]+)/", $url, $matches);
joshangell
1
Il ajoute du contenu avec de l'espace et récupère tout le texte après une URL sur une page. C'est mieux / (?: http (?: S)?: \ / \ /)? (?: www \.)? (?: m \.)? (?: youtu \ .be \ / | youtube \. com \ / (? :( ?: watch)? \? (?:. * &)? v (?: i)? = | (?: embed | v | vi | utilisateur) \ /)) ([a- zA-Z0-9 \ -_] *) /
Gino
36

Cela peut être très facilement accompli en utilisant parse_str et parse_url et est plus fiable à mon avis.

Ma fonction prend en charge les URL suivantes:

Comprend également le test sous la fonction.

/**
 * 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
la source
C'est vraiment génial et fonctionne également pour les vidéos vimeo
Chris James Champeau
1
C'est aussi ma réponse préférée. Il couvre à la fois YouTube et Vimeo. Une note, j'ai ajouté un tweak super mineur avec un isset supplémentaire () - else if (isset ($ qs ['vi'])). Merci beaucoup pour cela.
spedley
23

SOLTUION Pour tout type de lien !! :

<?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
?>

les sorties: GvJehZx3eQ1

T.Todua
la source
13

corrigé en fonction de Comment valider les identifiants vidéo 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
la source
9

Nous savons que l'ID vidéo a une longueur de 11 caractères et peut être précédé de v=ou vi=ou v/ou vi/ou youtu.be/. Donc, le moyen le plus simple de le faire:

<?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]);

Et sortie:

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
la source
9

Ce qui suit fonctionnera pour tous les liens 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
la source
4
if (preg_match('![?&]{1}v=([^&]+)!', $url . '&', $m))
    $video_id = $m[1];
NullUserException
la source
Merci, cela a bien fonctionné pour moi car je voulais tous les domaines, http et https, et tout autre type de merde dans l'url.
MakuraYami
4
(?<=\?v=)([a-zA-Z0-9_-]){11}

Cela devrait aussi le faire.

kyri
la source
4

J'avais du contenu de publication que je devais chiffrer tout au long pour obtenir l'identifiant Youtube. Il se trouve que cela se présente sous la forme du <iframe>code d'intégration fourni par Youtube.

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

Le modèle suivant que j'ai obtenu de @rob ci-dessus. L'extrait fait unforeach boucle une fois que les correspondances sont trouvées, et pour un bonus supplémentaire, je l'ai lié à l'image d'aperçu trouvée sur Youtube. Il pourrait potentiellement correspondre à plus de types de types et d'urls d'intégration 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;
}

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

Foxinni
la source
4

Pour extraire le iddans un groupe de capture, l'expression suivante ou un dérivé de celle-ci peut également être une option:

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

Démo

Tester

$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);

Production

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 vous souhaitez simplifier / modifier / explorer l'expression, cela a été expliqué dans le panneau supérieur droit de regex101.com . Si vous le souhaitez, vous pouvez également regarder dans ce lien , comment il correspondrait à certains exemples d'entrées.


Circuit RegEx

jex.im visualise les expressions régulières:

entrez la description de l'image ici


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

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

Je sais que le titre du fil fait référence à l'utilisation d'une expression régulière, mais comme le dit la citation de Zawinski, je pense vraiment qu'éviter les expressions régulières est mieux ici. Je recommanderais plutôt cette fonction:

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);
    }

}

Je recommande cela car l'ID des vidéos YouTube est toujours le même, indépendamment du style de l'URL, par exemple

  • http://www.youtube.com/watch?v=t_uW44Bsezg
  • http://www.youtube.com/watch?feature=endscreen&v=Id3xG4xnOfA&NR=1
  • `Et une autre forme Ulr dans laquelle le mot" embed / "est placé avant l'Id ... !!

et cela pourrait être le cas pour les iframetrucs intégrés et intégrés .

DreamLordOneiros
la source
0

Je viens de le trouver en ligne à l' adresse 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
la source
0

J'ai utilisé les données de la réponse de Shawn, mais j'ai généralisé et raccourci un peu l'expression régulière. La principale différence avec celui-ci est qu'il ne testera pas une URL Youtube valide, il cherchera simplement un ID vidéo. Cela signifie qu'il renverra toujours un ID vidéo pour www.facebook.com?wtv=youtube.com/v/vidid. Fonctionne pour tous les cas de test, mais est un peu plus laxiste. Par conséquent, il produira un faux positif pour quelque chose comme https://www.twitter.com/watch?v=vidid. Utilisez cette méthode si les données sont super incohérentes, sinon utilisez une expression régulière plus spécifique ou parse_url()et parse_str().

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

Je pense que vous essayez de faire ça.

<?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
la source
0

et que se passe-t-il si je veux extraire une URL de votre choix à partir d'une chaîne pleine d'autres caractères? comme ça:

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

et obtenir https://www.youtube.com/watch?v=cPW9Y94BJI0 à partir de cette chaîne?

Guillermo Esquivel
la source
0

Utilisez ce code:

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

résultat : C4kxS1ksqtw

lookly Dev
la source