it-swarm.com.de

Wie finde ich alle YouTube-Video-IDs in einem String mit Regex?

Ich habe ein Textfeld, in das Benutzer etwas schreiben können.

Zum Beispiel:

Lorem Ipsum ist einfach Dummy-Text . http://www.youtube.com/watch?v=DUQi_R4SgWo des Druckens und Satzes Industrie. Lorem Ipsum war der Industrie-Standard-Dummy-Text aller Zeiten seit den 1500er Jahren, als eine unbekannte Drucker nahm eine Galeere vom Typ und verschlüsselte es, um eine Art Probe zu machen Buch. Es hat nicht nur fünf überlebt Jahrhunderte, aber auch der Sprung in elektronischer Satz, verbleibend im Wesentlichen unverändert . http://www.youtube.com/watch?v=A_6gNZCkajU&feature=relmfu Es wurde in den 1960er Jahren mit .__ populär gemacht. die Freigabe von Letraset-Blättern Lorem Ipsum Passagen enthält, und in jüngerer Zeit mit dem Desktop Publishing Software wie Aldus PageMaker einschließlich Versionen von Lorem Ipsum.

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

Irgendeine Idee, wie das funktioniert?

88
n00b

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

  • letztes kurzes Format: 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
  • watch: 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
  • irgendein/Ding/geht !: http://www.youtube.com/sandalsResorts#p/c/54B8C800269D7C1B/2/PPS-8DMrAn4
  • beliebige/Subdomain/zu: http://gdata.youtube.com/feeds/api/videos/NLqAF9hrVbY
  • mehr params: 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 jedem dieser URL-Formulare entspricht und diese in Links umwandelt (sofern es sich nicht bereits um Links handelt):

// 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 demselben 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 Capture-Gruppe erfasst: $1.
  • Wenn Sie wissen, dass Ihr Text keine zuvor verknüpften URLs enthält, können Sie die negative Lookahead-Assertion, die diese Bedingung testet, sicher entfernen (Die Assertion beginnt mit dem Kommentar: "Assert-URL ist nicht vorverknüpft.") Dies beschleunigt den Regex etwas.
  • Die Ersetzungszeichenfolge kann entsprechend angepasst werden. Der oben angegebene Link erstellt einfach einen Link zur generischen "http://www.youtube.com/watch?v=VIDEO_ID"-Stil-URL und setzt den Link-Text auf: "YouTube link: VIDEO_ID".

Edit 2011-07-05: - Bindestrich zur ID-Zeichenklasse hinzugefügt

Edit 2011-07-17: Reguläre Ausdrücke wurden korrigiert, um einen verbleibenden Teil (z. B. Abfrage) der URL nach der YouTube-ID zu verbrauchen. 'i'ignore-case Modifikator hinzugefügt. Funktion in camelCase umbenannt. Verbesserter Pre-Linked-Lookahead-Test.

Edit 2011-07-27: Neue "user" - und "ytscreeningroom" -Formate von YouTube-URLs hinzugefügt.

Edit 2011-08-02: Vereinfacht, um neue "any/thing/goes" -Youtube-URLs zu verarbeiten.

Bearbeiten 2011-08-25: Mehrere Modifikationen:

  • Javascript-Version hinzugefügt: linkifyYouTubeURLs() function.
  • In der vorherigen Version war der Teil des Schemas (HTTP-Protokoll) optional und würde daher zu ungültigen URLs passen. Das Schema wurde zum Teil benötigt.
  • In der vorherigen Version wurde der \b-Wortbegrenzungsanker um die VIDEO_ID verwendet. Dies funktioniert jedoch nicht, wenn die VIDEO_ID mit einem --Strich beginnt oder endet. Behoben, so dass diese Bedingung behandelt wird.
  • Der Ausdruck VIDEO_ID wurde geändert, sodass er genau 11 Zeichen umfassen muss.
  • In der vorherigen Version konnten nicht verknüpfte URLs nicht ausgeschlossen werden, wenn nach der VIDEO_ID eine Abfragezeichenfolge vorhanden war. Die negative Lookahead-Behauptung wurde verbessert, um dies zu beheben.
  • + und % zur Zeichenklasse hinzugefügt, die der Abfragezeichenfolge entspricht.
  • Regex-Begrenzungszeichen für PHP -Version von: % in a: ~ geändert.
  • Ein Abschnitt "Notizen" mit einigen praktischen Notizen wurde hinzugefügt.

Bearbeiten 2011-10-12: Der Teil des YouTube-URL-Hosts kann jetzt eine beliebige Unterdomäne haben (nicht nur www.).

Edit 2012-05-01: Der URL-Abschnitt zum Verbrauchen kann jetzt '-' zulassen.

Bearbeiten 2013-08-23: Zusätzliches Format hinzugefügt von @Mei. (Der Abfrageteil kann einen . Punkt haben.

Edit 2013-11-30: Zusätzliches Format hinzugefügt von @CRONUS: youtube-nocookie.com.

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

283
ridgerunner

Hier ist eine Methode, die ich einmal für ein Projekt geschrieben habe, das Videoschlüssel von YouTube und Vimeo 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 einen Regex, der alle Links aus einem Text extrahiert. Google wird Ihnen dort helfen.
  2. Schleife alle Links und rufe getHostInfo () für jeden auf
10
Christof

Während die Antwort von ridgerunner die Basis für meine Antwort ist, löst sich diese NICHT für alle URLs auf, und ich glaube nicht, dass sie dazu in der Lage ist, aufgrund mehrerer möglicher Übereinstimmungen von VIDEO_ID in einer YouTube-URL. Mein Regex schließt seinen aggressiven Ansatz als letzten Ausweg ein, versucht jedoch zuerst alle gängigen Übereinstimmungen, wodurch die Wahrscheinlichkeit eines falschen Übereinstimmungen 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 später in der URL eine 11-stellige Folge haben. dh: 

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

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

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

8
ezwrighter

Versuchen

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

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

Ich habe es online hier auf Rubular mit Ihrem Sample-String geprüft.

2
stema

Benutzen:

<?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
?>
2
Noor Khan

Okay, ich habe meine eigene Funktion gemacht. Ich glaube aber, dass es ziemlich ineffizient ist.

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

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

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

Prüfen Sie es online hier bei phpliveregex .

1
B L Praveen

Das ursprüngliche Poster fragte "Ich möchte es analysieren und alle YouTube-Video-URLs und ihre IDs finden." Ich habe die populärste Antwort oben auf preg_match umgestellt und die Video-ID und die URL zurückgegeben.

YouTube-URL und -ID vom Post abrufen:

$match[0] = Full URL
$match[1] = video ID

function get_youtube_id($input) {
    $input = preg_match('~https?://(?:[0-9A-Z-]+\.)?(?:youtu\.be/|youtube(?:-nocookie)?\.com\S*[^\w\s-])([\w-]{11})(?=[^\w-]|$)(?![?=&+%\w.-]*(?:[\'"][^<>]*>|</a>))[?=&+%\w.-]*~ix',
                        $input, $match);
    return $match;
}
1
Lee Woodman
String urlid="" ;
String  url="http://www.youtube.com/watch?v=0zM4nApSvMg#t=0m10s";
Pattern pattern =Pattern.compile("(?:http|https|)(?::\\/\\/|)(?:www.|)(?:youtu\\.be\\/|youtube\\.com(?:\\/embed\\/|\\/v\\/|\\/watch\\?v=|\\/ytscreeningroom\\?v=|\\/feeds\\/api\\/videos\\/|\\/user\\\\S*[^\\w\\-\\s]|\\S*[^\\w\\-\\s]))([\\w\\-\\_]{11})[a-z0-9;:@#?&%=+\\/\\$_.-]*");
Matcher result = pattern.matcher(url);
    if (result.find())
    {
         urlid=result.group(1);

    }

Dieser Code in Java funktioniert derzeit für alle Youtube-URLs absolut einwandfrei.

0
Sravya Singh

Finden Sie einen YouTube-Link einfach über eine Zeichenfolge:

function my_url_search($se_action_data)
{
    $regex = '/https?\:\/\/[^\" ]+/i';
    preg_match_all($regex, $se_action_data, $matches);
    $get_url=array_reverse($matches[0]);
    return array_unique($get_url);
}
echo my_url_search($se_action_data)