91 votes

Comment trouver tous les identifiants de vidéos Youtube dans une chaîne en utilisant une expression régulière?

J'ai un champ de texte où les utilisateurs peuvent écrire quoi que ce soit.

Par exemple:

Le Lorem Ipsum est simplement faux texte. http://www.youtube.com/watch?v=DUQi_R4SgWo de l'impression et de typographie de l'industrie. Lorem Ipsum a été l' l'industrie du standard dummy text jamais depuis les années 1500, quand un inconnu l'imprimante a eu une galère de type et brouillés pour faire un type de spécimen livre. Il a pas fait que survivre cinq siècles, mais aussi le saut dans électronique de la composition, en restant pour l'essentiel inchangée. http://www.youtube.com/watch?v=A_6gNZCkajU&feature=relmfu Il a été popularisé dans les années 1960 avec la libération de feuilles Letraset contenant Lorem Ipsum passages, et plus récemment, avec la publication de bureau logiciel comme Aldus PageMaker y compris les versions de Lorem Ipsum.

Maintenant, je voudrais analyser et trouver toutes les url de la vidéo Youtube et de leur id.

Aucune idée de comment ça fonctionne?

287voto

ridgerunner Points 14773

Une URL de la vidéo YouTube peut être rencontré dans une variété de formats:

  • dernier court-format: http://youtu.be/NLqAF9hrVbY
  • iframe: http://www.youtube.com/embed/NLqAF9hrVbY
  • iframe (sécurisé): https://www.youtube.com/embed/NLqAF9hrVbY
  • objet param: http://www.youtube.com/v/NLqAF9hrVbY?fs=1&hl=en_US
  • objet intégrer: http://www.youtube.com/v/NLqAF9hrVbY?fs=1&hl=en_US
  • watch: http://www.youtube.com/watch?v=NLqAF9hrVbY
  • utilisateurs: http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo
  • ytscreeningroom: http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I
  • tout/chose/va!: http://www.youtube.com/sandalsResorts#p/c/54B8C800269D7C1B/2/PPS-8DMrAn4
  • tout/sous-domaine/trop: http://gdata.youtube.com/feeds/api/videos/NLqAF9hrVbY
  • plus params: http://www.youtube.com/watch?v=spDj54kf-vY&feature=g-vrec
  • requête peut avoir point: http://www.youtube.com/watch?v=spDj54kf-vY&feature=youtu.be
  • nocookie de domaine: http://www.youtube-nocookie.com

Voici une fonction PHP avec une commenté l'expression rationnelle qui correspond à chacun de ces URL formes et les convertit les liens (si ils ne sont pas des liens déjà):

// Linkify youtube URLs which are not already links.
function linkifyYouTubeURLs($text) {
    $text = preg_replace('~
        # Match non-linked youtube URL in the wild. (Rev:20130823)
        https?://         # Required scheme. Either http or https.
        (?:[0-9A-Z-]+\.)? # Optional subdomain.
        (?:               # Group host alternatives.
          youtu\.be/      # Either youtu.be,
        | youtube         # or youtube.com or
          (?:-nocookie)?  # youtube-nocookie.com
          \.com           # followed by
          \S*             # Allow anything up to VIDEO_ID,
          [^\w\s-]       # but char before ID is non-ID char.
        )                 # End host alternatives.
        ([\w-]{11})      # $1: VIDEO_ID is exactly 11 chars.
        (?=[^\w-]|$)     # Assert next char is non-ID or EOS.
        (?!               # Assert URL is not pre-linked.
          [?=&+%\w.-]*    # Allow URL (query) remainder.
          (?:             # Group pre-linked alternatives.
            [\'"][^<>]*>  # Either inside a start tag,
          | </a>          # or inside <a> element text contents.
          )               # End recognized pre-linked alts.
        )                 # End negative lookahead assertion.
        [?=&+%\w.-]*        # Consume any URL (query) remainder.
        ~ix', 
        '<a href="http://www.youtube.com/watch?v=$1">YouTube link: $1</a>',
        $text);
    return $text;
}

Et Voici une version JavaScript avec exactement le même regex (avec commentaires supprimés):

// Linkify youtube URLs which are not already links.
function linkifyYouTubeURLs(text) {
    var re = /https?:\/\/(?:[0-9A-Z-]+\.)?(?:youtu\.be\/|youtube(?:-nocookie)?\.com\S*[^\w\s-])([\w-]{11})(?=[^\w-]|$)(?![?=&+%\w.-]*(?:['"][^<>]*>|<\/a>))[?=&+%\w.-]*/ig;
    return text.replace(re,
        '<a href="http://www.youtube.com/watch?v=$1">YouTube link: $1</a>');
}

Notes:

  • Le VIDEO_ID partie de l'URL qui est capturé dans le seul et unique groupe de capture: $1.
  • Si vous savez que votre texte ne contient pas de pré-Url liés, vous pouvez supprimer en toute sécurité l'anticipation négatif affirmation qui teste cette condition (L'affirmation début avec le commentaire: "Affirmer l'URL n'est pas pré-lié.") Cela permettra d'accélérer la regex quelque peu.
  • La chaîne de remplacement peut être modifié pour répondre. Celle prévue ci-dessus crée simplement un lien vers le générique "http://www.youtube.com/watch?v=VIDEO_ID" URL de style et définit le texte du lien: "YouTube link: VIDEO_ID".

Edit 2011-07-05: Ajouté - trait d'union pour l'ID de classe char

Edit 2011-07-17: Fixe regex pour consommer toute partie restante (par exemple, la requête) de l'URL suivante ID YouTube. Ajouté 'i' ignorer cas de modification. Renommé fonction de camelCase. Amélioration de la pré-lié d'anticipation de test.

Edit 2011-07-27: Ajout de nouvelles "utilisateur" et "ytscreeningroom" formats de YouTube Url.

Edit 2011-08-02: Simplifié/généralisées à gérer de nouvelles "tout/chose/va" YouTube Url.

Edit 2011-08-25: Plusieurs modifications:

  • Ajout d'une version Javascript de: linkifyYouTubeURLs() fonction.
  • La version précédente avait le schéma (protocole HTTP) la partie facultative et donc correspondre à des Url non valide. Faites le schéma de la partie requise.
  • La version précédente a utilisé l' \b limite de mot d'ancrage autour de la VIDEO_ID. Toutefois, cela ne fonctionnera pas si le VIDEO_ID commence ou se termine avec un - tableau de bord. Corrigé de sorte qu'il gère cette condition.
  • Changé la VIDEO_ID expression qui doit être exactement de 11 caractères.
  • La version précédente a échoué pour exclure les Url liés s'ils avaient une chaîne de requête à la suite de la VIDEO_ID. L'amélioration de l'anticipation négatif affirmation de résoudre ce problème.
  • Ajouté + et % à la classe de caractères correspondant de la chaîne de requête.
  • Changé la version de PHP regex délimiteur de: % d'un: ~.
  • Ajout d'une section "Notes" avec un peu de pratique notes.

Edit 2011-10-12: Youtube URL de l'hôte de la partie, peuvent maintenant avoir tout sous-domaine (et pas seulement www.).

Edit 2012-05-01: Le consommer URL de l'article peut maintenant permettre '-'.

Edit 2013-08-23: Ajout format supplémentaires fournis par @Mei. (La partie requête peut avoir un . dot.

Edit 2013-11-30: Ajout format supplémentaires fournis par @CRONOS: youtube-nocookie.com.

10voto

Chris Points 983

Voici une méthode que j'ai écrite pour un projet qui extrait des clés vidéo youtube et vimeo:

 /**
 *  strip important information out of any video link
 *
 *  @param  string  link to a video on the hosters page
 *  @return mixed  FALSE on failure, array on success
 */
function getHostInfo ($vid_link)
{
  // youtube get video id
  if (strpos($vid_link, 'youtu'))
  {
    // regular links
    if (preg_match('/(?<=v\=)([\w\d-_]+)/', $vid_link, $matches))
      return array('host_name' => 'youtube', 'original_key' => $matches[0]); 
    // ajax hash tag links
    else if (preg_match('§([\d\w-_]+)$§i', $vid_link, $matches))
      return array('host_name' => 'youtube', 'original_key' => $matches[0]);
    else
      return FALSE;
  }
  // vimeo get video id
  elseif (strpos($vid_link, 'vimeo'))
  {
    if (preg_match('§(?<=/)([\d]+)§', $vid_link, $matches))
      return array('host_name' => 'vimeo', 'original_key' => $matches[0]); 
    else
      return FALSE;
  }
  else
    return FALSE;
}
 
  1. Trouvez une expression régulière qui extraira tous les liens d'un texte. Google vous y aidera.
  2. Bouclez tous les liens et appelez getHostInfo () pour chaque

J'espère que cela pourra aider. À votre santé

8voto

ezwrighter Points 137

Alors que ridgerunner la réponse est à la base de ma réponse, sa ne résout PAS pour toutes les url et je ne crois pas qu'il en est capable, en raison de plusieurs correspondances possibles de l' VIDEO_ID dans une URL YouTube. Ma regex comprend son approche agressive comme un dernier recours, mais les tentatives de tous les appariements de la première, considérablement réduit la possibilité d'un mauvais match plus tard dans l'URL.

Cette regex:

/https?:\/\/(?:[0-9A-Z-]+\.)?(?:youtu\.be\/|youtube\.com(?:\/embed\/|\/v\/|\/watch\?v=|\/ytscreeningroom\?v=|\/feeds\/api\/videos\/|\/user\S*[^\w\-\s]|\S*[^\w\-\s]))([\w\-]{11})[?=&+%\w-]*/ig;

Gère tous les cas à l'origine référencé dans ridgerunners exemples, en plus de toute url qui pourrait arriver à avoir un 11 séquence de caractères plus tard dans l'url. c'est à dire:

http://www.youtube.com/watch?v=GUEZCxBcM78&feature=pyv&feature=pyv&ad=10059374899&kw=%2Bwingsuit

Voici un exemple de travail que les tests de tous les exemples de YouTube url:

http://jsfiddle.net/DJSwc/5/

2voto

HeartDisk Points 302
 <?php

//the youtube url string

$youtube_url='http://www.youtube.com/watch?v=8VtUYvwktFQ';

//use regex to get the video ID

$regex='#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+#';

preg_match($regex, $youtube_url, $id);

//plug that into our html
?>
 

J'espère que ce code vous aide.

2voto

n00b Points 2492

Ok j'ai fait une fonction de la mienne. Mais je crois que c'est plutôt inefficace. Toutes les améliorations sont les bienvenues:

 function get_youtube_videos($string) {

    $ids = array();

    // find all urls
    preg_match_all('/(http|https)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/', $string, $links);

    foreach ($links[0] as $link) {
        if (preg_match('~youtube\.com~', $link)) {
            if (preg_match('/[^=]+=([^?]+)/', $link, $id)) {
                $ids[] = $id[1];
            }
        }
    }


    return $ids;
}
 

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