156 votes

Expression régulière PHP pour obtenir l'identifiant vidéo YouTube?

Quelqu'un peut-il me montrer comment obtenir l'identifiant youtube à partir d'une URL, quelles que soient les autres variables GET présentes dans l'URL.

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

1 votes

Cela pourrait être utile stackoverflow.com/questions/9522868/…

1 votes

Tu devrais regarder mon code github.com/lingtalfi/video-ids-and-thumbnails/blob/master/…, j'ai fourni des fonctions qui extraient l'id de youtube, vimeo et dailymotion.

0 votes

@ling dans la fonction getVideoThumbnailByUrl(), vous utilisiez la fonction file_get_contents() désuè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);

332voto

Peter Ajtai Points 26377

Utilisez parse_url() et parse_str().

(Vous pouvez utiliser des regex pour presque tout, mais ils sont très faciles à mettre en erreur. Donc, s'il existe des fonctions PHP spécifiquement pour ce que vous essayez de réaliser, utilisez-les.)

parse_url prend une chaîne et la découpe en un tableau contenant plusieurs informations. Vous pouvez travailler avec ce tableau, ou vous pouvez spécifier l'élément que vous voulez en tant que second argument. Dans ce cas, nous sommes intéressés par la requête, qui est PHP_URL_QUERY.

Maintenant nous avons la requête, qui est v=C4kxS1ksqtw&feature=relate, mais nous voulons seulement la partie après v=. Pour cela, nous utilisons parse_str qui fonctionne essentiellement comme GET sur une chaîne. Il prend une chaîne et crée les variables spécifiées dans la chaîne. Dans ce cas, $v et $feature sont créés. Nous sommes seulement intéressés par $v.

Pour être sûr, vous ne voulez pas juste stocker toutes les variables de parse_url dans votre espace de noms (voir le commentaire de mellowsoon). Au lieu de cela, stockez 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 vous ne pouvez pas écraser accidentellement une variable existante.

En mettant tout ensemble, nous avons :

Exemple de travail


Édition :

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

Certaines personnes, lorsqu'elles sont confrontées à un problème, pensent 'Je sais, j'utiliserai des expressions régulières'. Maintenant, elles ont deux problèmes.Jamie Zawinski

1 votes

Bien que cela n'utilise pas regex (du moins visiblement - je ne suis pas sûr de comment parse_url() fonctionne en interne), c'est la bonne méthode à suivre.

11 votes

. Bien que, pour être sérieux, l'utilisation des fonctions de langage pour effectuer une tâche est souvent préférable aux acrobaties qu'un bon regex peut exiger.

1 votes

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. Avoir des variables qui apparaissent comme par magie n'est jamais une bonne idée.

171voto

Anthony Leach Points 809
preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+(?=\?)|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#", $url, $matches);

Cela tiendra compte de

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 supporter : 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);

4 votes

J'ai mis à jour pour gérer également les URL comme ceci : youtube.com/embed/7zuAOomfiCc #(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+(?=\?)|(?<=embed/)‌​[^&\n]+|(?<=v=)[^&\n‌​]+|(?<=youtu.be/)[^&‌​\n]+#

0 votes

Le commentaire d'Arun SS : "@SimonBS, #(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+(?=\?)|(?<=embed/)‌​[^&\n]+|(?<=v=)[^&\n‌​]+|(?<=youtu.be/)[^&‌​\n]+# ne fonctionne pas parfaitement pour les codes d'intégration. Il ajoute les parties restantes des URL. Le résultat semble être le suivant : 45EFxhTeKwy" frameborder="0" allowfullscreen>. Comment enlever les parties restantes ?"

12 votes

Cela fonctionne pour toutes les URL, y compris les chaînes d'intégration (?<=(?:v|i)=)[a-zA-Z0-9-]+(?=&)|(?<=(?:v|i)\/)[^&\n]+|(?<=em&zwnj;​bed\/)[^"&\n]+|(?<=(‌​?:v|i)=)[^&\n]+|(?<=‌​youtu.be\/)[^&\n]+ rubular.com/r/M9PJYcQxRW

114voto

Shawn Points 1501

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|shorts)\/))([^\?&\"'>]+)/", $url, $matches);

$matches[1] contient l'identifiant de la vidéo

Correspondances :

  • 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
  • https://m.youtube.com/watch?v=vidid
  • youtube.com/shorts/vidid

Ne correspond pas :

  • www.facebook.com?wtv=youtube.com/v/vidid

0 votes

Avez-vous une version C/objc/c++ de cette chaîne? Je ne sais pas quels éléments échapper.

0 votes

J'ai essayé : "^(?:http(?:s)?://)?(?:www\\.)?(?:youtu\\.be/|youtube\\.com/‌​(?:(?:watch)?\?(?:.*‌​&)?v(?:i)?=|(?:embed‌​|v|vi|user)/))([^\?&‌​\"'>]+)" Ne pas passer tous vos exemples

1 votes

J'ai trouvé mon problème. Voici la chaîne c finale : "^(?:http(?:s)?://)?(?:www\\.)?(?:youtu\\.be/|youtube\\.com/‌​(?:(?:watch)?\\?(?:.‌​*&)?v(?:i)?=|(?:embe‌​d|v|vi|user)/))([^\?‌​&\"'>]+)"

41voto

Kus Points 977

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 URLs suivantes :

Inclut également le test ci-dessous la fonction.

/**
 * Obtenir l'ID de la vidéo Youtube à partir de l'URL
 *
 * @param string $url
 * @return mixed ID de la vidéo Youtube ou FALSE si non trouvé
 */
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";
}

0 votes

C'est vraiment génial et fonctionne en fait aussi pour les vidéos de vimeo

1 votes

C'est aussi ma réponse préférée. Il couvre à la fois YouTube et Vimeo. Une note, j'ai ajouté une légère retouche avec un isset() supplémentaire - else if(isset($qs['vi'])). Un grand merci pour cela.

25voto

tazo todua Points 495

SOLUTION Pour n'importe quel type de lien !!:

outputs: GvJehZx3eQ1

0 votes

Faites attention en utilisant ceci pour faire correspondre n'importe quelle URL YT : pour un lien de la forme https://www.youtube.com/watch?v=9E6F57s-V7U&ab_channel=Accen‌​t%27sWayEnglishwithH‌​adar $results[0] ne contiendra pas le lien complet, juste la partie jusqu'à l'identifiant de la vidéo. Cela a aidé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X