Wie finde ich alle YouTube-Video-IDs in einer Zeichenfolge mithilfe einer Regex?

Lesezeit: 9 Minuten

Wie finde ich alle YouTube Video IDs in einer Zeichenfolge mithilfe einer
n00b

Ich habe ein Textfeld, wo Benutzer alles schreiben können.

Zum Beispiel:

Lorem Ipsum ist einfach Blindtext.
http://www.youtube.com/watch?v=DUQi_R4SgWo
der Druck- und Setzindustrie. Lorem Ipsum ist seit den 1500er Jahren der Standard-Dummy-Text der Branche, als ein unbekannter Drucker eine Reihe von Typen nahm und daraus ein Musterbuch für Typen erstellte. Sie hat nicht nur fünf Jahrhunderte, sondern auch den Sprung in den elektronischen Satz überstanden und ist im Wesentlichen unverändert geblieben.
http://www.youtube.com/watch?v=A_6gNZCkajU&feature=relmfu
Es wurde in den 1960er Jahren mit der Veröffentlichung von Letraset-Blättern mit Passagen von Lorem Ipsum und in jüngerer Zeit mit Desktop-Publishing-Software wie Aldus PageMaker, einschließlich Versionen von Lorem Ipsum, populär.

Jetzt möchte ich es analysieren und alle YouTube-Video-URLs und ihre IDs finden.

Irgendeine Idee, wie das funktioniert?

  • Mögliches Duplikat von Javascript REGEX: Wie bekomme ich die YouTube-Video-ID von der URL?

    – T. Todua

    20. Januar 2015 um 14:14 Uhr

Eine YouTube-Video-URL kann in verschiedenen Formaten auftreten:

  • neustes Kurzformat: http://youtu.be/NLqAF9hrVbY
  • iframe: http://www.youtube.com/embed/NLqAF9hrVbY
  • iframe (sicher): https://www.youtube.com/embed/NLqAF9hrVbY
  • Objektparameter: http://www.youtube.com/v/NLqAF9hrVbY?fs=1&hl=en_US
  • Objekt einbetten: http://www.youtube.com/v/NLqAF9hrVbY?fs=1&hl=en_US
  • Uhr: http://www.youtube.com/watch?v=NLqAF9hrVbY
  • Benutzer: http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo
  • ytscreeningroom: http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I
  • alles geht!: http://www.youtube.com/sandalsResorts#p/c/54B8C800269D7C1B/2/PPS-8DMrAn4
  • beliebig/subdomain/auch: http://gdata.youtube.com/feeds/api/videos/NLqAF9hrVbY
  • weitere Parameter: http://www.youtube.com/watch?v=spDj54kf-vY&feature=g-vrec
  • Abfrage kann Punkt haben: http://www.youtube.com/watch?v=spDj54kf-vY&feature=youtu.be
  • nocookie-Domain: http://www.youtube-nocookie.com

Hier ist eine PHP-Funktion mit einem kommentierten regulären Ausdruck, der mit jeder dieser URL-Formen übereinstimmt und sie in Links umwandelt (falls sie nicht bereits Links sind):

// Linkify youtube URLs which are not already links.
function linkifyYouTubeURLs($text) {
    $text = preg_replace('~(?#!js YouTubeId Rev:20160125_1800)
        # 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;
}

; // $YouTubeId beenden.

Und hier ist eine JavaScript-Version mit genau derselben Regex (mit entfernten Kommentaren):

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

Anmerkungen:

  • Der VIDEO_ID-Teil der URL wird in der einzigen Erfassungsgruppe erfasst: $1.
  • Wenn Sie wissen, dass Ihr Text keine vorverlinkten URLs enthält, können Sie die negative Lookahead-Assertion, die auf diese Bedingung testet, sicher entfernen (Die Assertion, die mit dem Kommentar beginnt: “Assert-URL ist nicht vorverlinkt.”) Dadurch wird die Regex etwas beschleunigt.
  • Die Ersetzungszeichenfolge kann entsprechend geändert werden. Der oben bereitgestellte erstellt einfach einen Link zum Generikum "http://www.youtube.com/watch?v=VIDEO_ID" style URL und setzt den Linktext auf: "YouTube link: VIDEO_ID".

Bearbeiten 05.07.2011: Hinzugefügt - Bindestrich zur ID-Zeichenklasse

Bearbeiten 17.07.2011: Regex korrigiert, um verbleibende Teile zu verbrauchen (z Anfrage) der URL nach der YouTube-ID. Hinzugefügt 'i' Fall ignorieren Modifikator. Funktion in camelCase umbenannt. Verbesserter vorverlinkter Lookahead-Test.

Bearbeiten 2011-07-27: Neue „user“- und „ytscreeningroom“-Formate von YouTube-URLs hinzugefügt.

Bearbeiten 02.08.2011: Vereinfacht/verallgemeinert, um mit neuen YouTube-URLs „Alles/Dinge/Geht“ umzugehen.

Bearbeiten 2011-08-25: Mehrere Modifikationen:

  • Eine Javascript-Version hinzugefügt von: linkifyYouTubeURLs() Funktion.
  • In früheren Versionen war der Teil des Schemas (HTTP-Protokoll) optional und würde daher ungültige URLs abgleichen. Den erforderlichen Schemateil erstellt.
  • Die vorherige Version verwendete die \b Wortgrenzenanker um die VIDEO_ID. Dies funktioniert jedoch nicht, wenn die VIDEO_ID mit einem beginnt oder endet - Bindestrich. Behoben, damit diese Bedingung behandelt wird.
  • Der VIDEO_ID-Ausdruck wurde so geändert, dass er genau 11 Zeichen lang sein muss.
  • Die vorherige Version konnte vorab verlinkte URLs nicht ausschließen, wenn sie eine Abfragezeichenfolge nach der VIDEO_ID hatten. Die negative Lookahead-Assertion wurde verbessert, um dies zu beheben.
  • Hinzugefügt + und % zur Zeichenklasse passender Abfragezeichenfolge.
  • Regex-Trennzeichen der PHP-Version geändert von: % zu einem: ~.
  • Abschnitt „Notizen“ mit einigen praktischen Notizen hinzugefügt.

Bearbeiten 12.10.2011: Der YouTube-URL-Hostteil kann jetzt eine beliebige Subdomain haben (nicht nur www.).

Bearbeiten 01.05.2012: Der Konsum-URL-Abschnitt kann jetzt ‘-‘ zulassen.

Bearbeiten 2013-08-23: Zusätzliches Format hinzugefügt, das von @Mei bereitgestellt wird. (Der Abfrageteil kann eine . Punkt.

Bearbeiten 30.11.2013: Zusätzliches Format hinzugefügt, das von @CRONUS bereitgestellt wird: youtube-nocookie.com.

Bearbeiten 2016-01-25: Regex korrigiert, um den von CRONUS bereitgestellten Fehlerfall zu behandeln.

  • Ich habe keine Spezifikation gesehen, obwohl ich eine gesucht habe. Ich habe gerade den Bindestrich in einigen Links in der Wildnis des Internets bemerkt. Zum Beispiel: youtube.com/watch?v=CLPk-6_xgiY

    – CottonBallPaws

    5. Juli 2011 um 23:20 Uhr


  • @littleFluffyKitty: Danke für den Hinweis. Habe die Antwort aktualisiert, um den Bindestrich als gültiges ID-Zeichen aufzunehmen.

    – Gratläufer

    6. Juli 2011 um 0:29 Uhr

  • @ridgerunner: Wenn Sie sich mit einer Bearbeitung nicht sicher sind, können Sie einen Rollback durchführen. Zusätzlich wird wie bei Wikipedia die gesamte Historie mit Ihren Credits geführt. Ich habe gesehen, dass Sie sich die Antwort im Laufe der Zeit wirklich zurechtgelegt haben, also wäre es schade, Sie hier zu verlieren.

    – hakre

    3. Mai 2012 um 23:52 Uhr

  • Hier ist eine, die nicht funktioniert: youtube.com/watch?v=E1IPnnttL9k&feature=youtu.be

    – Andrebel

    11. Oktober 2012 um 20:20 Uhr


  • Das funktioniert großartig, schlägt aber mit diesem (neuen?) Querystring-Parameter fehl: feature=youtu.be. Ändern [?=&+%\w-]* zu [?=&+%\w-\.]* auf Ihrer Zeile “Verbleibende URL verbrauchen” macht den Trick. Danke!

    – Mei Gwilym

    20. Juni 2013 um 13:03 Uhr

1646942048 19 Wie finde ich alle YouTube Video IDs in einer Zeichenfolge mithilfe einer
Christof

Hier ist eine Methode, die ich einmal für ein Projekt geschrieben habe, das YouTube- und Vimeo-Videoschlüssel extrahiert:

/**
 *  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. Finden Sie eine Regex, die alle Links aus einem Text extrahiert. Google hilft dir da weiter.
  2. Schleifen Sie alle Links und rufen Sie für jeden getHostInfo() auf

  • vielen Dank! leichte Mod if(strpos($vid_link, 'youtu')) erfasst die Kurz-URL youtu.be zusätzlich zu den gemeinsamen URLs.

    – Chamilian

    8. Oktober 2011 um 9:53 Uhr

  • gern geschehen. danke für das Update, ich habe die Änderung bearbeitet. Nebenbei bemerkt scheint die Regex von Ridgerunner das einzig Wahre zu sein, und ich empfehle, sie über meiner einfachen Sache zu verwenden. Prost

    – Christof

    10. Oktober 2011 um 6:27 Uhr


  • genau das was ich gesucht habe. genau richtig Kumpel! +1

    – Malita N

    18. Juli 2012 um 5:50 Uhr

Während die Antwort von Ridgerunner die Grundlage für meine Antwort ist, löst seine Antwort NICHT alle URLs auf, und ich glaube nicht, dass sie dazu in der Lage ist, da mehrere Übereinstimmungen mit möglich sind VIDEO_ID in einer YouTube-URL. Meine Regex beinhaltet seinen aggressiven Ansatz als letzten Ausweg, versucht aber zuerst alle gängigen Übereinstimmungen, wodurch die Möglichkeit einer falschen Übereinstimmung später in der URL erheblich reduziert wird.

Diese 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;

Behandelt alle Fälle, auf die ursprünglich in Ridgerunners-Beispielen verwiesen wurde, sowie alle URLs, die möglicherweise später in der URL eine Folge von 11 Zeichen enthalten. dh:

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

Hier ist ein funktionierendes Beispiel, das alle YouTube-Beispiel-URLs testet:

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

Versuchen

[^\s]*youtube\.com[^\s]*?v=([-\w]+)[^\s]*

Sie finden die Video-IDs in der ersten Erfassungsgruppe. Was ich nicht weiß, was ist eine gültige Video-ID? Im Moment schaue ich nach v= und alle einfangen -A-Za-z0-9_.

Ich habe es online überprüft hier auf Rubel mit Ihrem Beispiel-String.

Wie finde ich alle YouTube Video IDs in einer Zeichenfolge mithilfe einer
Noor Khan

Verwenden:

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

1646942049 960 Wie finde ich alle YouTube Video IDs in einer Zeichenfolge mithilfe einer
Peter Mortensen

Okay, ich habe eine eigene Funktion erstellt. Aber ich glaube, es ist ziemlich ineffizient. Jede Verbesserung ist willkommen:

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

1646942049 960 Wie finde ich alle YouTube Video IDs in einer Zeichenfolge mithilfe einer
Peter Mortensen

Ich habe einen einfachen Ausdruck versucht, um nur die Video-ID zu erhalten:

[?&]v=([^&#]*)

Überprüfen Sie, ob es online funktioniert hier bei phpliveregex.

988850cookie-checkWie finde ich alle YouTube-Video-IDs in einer Zeichenfolge mithilfe einer Regex?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy