PHP Regex um YouTube Video ID zu bekommen?

137

Kann mir jemand zeigen, wie man die YouTube-ID aus einer URL herausholt, unabhängig davon, welche anderen GET-Variablen in der URL enthalten sind.

Verwenden Sie dieses Video zum Beispiel: http://www.youtube.com/watch?v=C4kxS1ksqtw&feature=related
Also zwischen v=und vor dem nächsten&

wesbos
quelle
1
Das könnte hilfreich sein stackoverflow.com/questions/9522868/…
1
Sie sollten sich meinen Code github.com/lingtalfi/video-ids-and-thumbnails/blob/master/… ansehen. Ich biete Funktionen an, die IDs aus YouTube, Vimeo und Dailymotion extrahieren.
Ling
@ling in der Funktion getVideoThumbnailByUrl () haben Sie die veraltete Datei_get_contents () für Vimeo verwendet. Dieser Ersatz wird überall funktionieren:$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 Auch in getYoutubeId ($ url) akzeptiert die letzte Bedingung eine beliebige Zeichenfolge und validiert sie als YT-ID. Ich habe es als "Junk" übergeben und es hat Junk als ID zurückgegeben, die aus dieser Zeichenfolge analysiert wurde.
Jerrygarciuh
@jerrygarciuh: afaik file_get_contents ist nicht veraltet. Wenn Sie ein Problem mit dieser Funktion hatten, können Sie ein Problem auf github melden. Vielen Dank, dass Sie den Fehler in getYoutubeId entdeckt haben (ich habe ihn verbessert).
Ling

Antworten:

304

Verwenden Sie parse_url () und parse_str () .

(Sie können reguläre Ausdrücke für fast alles verwenden, aber es ist sehr leicht, Fehler zu machen. Wenn es also PHP-Funktionen speziell für das gibt, was Sie erreichen möchten, verwenden Sie diese.)

parse_url nimmt einen String und schneidet ihn in ein Array mit einer Reihe von Informationen. Sie können mit diesem Array arbeiten oder das gewünschte Element als zweites Argument angeben. In diesem Fall interessiert uns die Abfrage PHP_URL_QUERY.

Jetzt haben wir die Abfrage, das heißt v=C4kxS1ksqtw&feature=relate, aber wir wollen nur das Teil danach v=. Dazu wenden wir uns dem zu, parse_strwas im Grunde wie GETbei einer Saite funktioniert . Es nimmt eine Zeichenfolge und erstellt die in der Zeichenfolge angegebenen Variablen. In diesem Fall $vund $featurewird erstellt. Wir sind nur interessiert an $v.

Um sicher zu gehen, möchten Sie nicht einfach alle Variablen aus dem parse_urlin Ihrem Namespace speichern (siehe Kommentar von mellowsoon). Speichern Sie die Variablen stattdessen als Elemente eines Arrays, damit Sie steuern können, welche Variablen Sie speichern, und eine vorhandene Variable nicht versehentlich überschreiben können.

Alles zusammen haben wir:

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

Arbeitsbeispiel


Bearbeiten:

hehe - danke Charles. Das hat mich zum Lachen gebracht, ich habe das Zawinski-Zitat noch nie gesehen:

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

Peter Ajtai
quelle
1
Obwohl es keinen regulären Ausdruck verwendet (zumindest sichtbar - ich bin mir nicht sicher, wie es parse_url()unter der Haube funktioniert), ist dies der richtige Weg.
Thomas Owens
11
<Zawinski-Zitat hier einfügen>. In aller Ernsthaftigkeit ist die Verwendung von Sprachfunktionen zur Ausführung einer Aufgabe häufig besser als das Reifenspringen, das eine gute Regex erfordern kann.
Charles
1
Ich würde nur vorschlagen, den zweiten Parameter von parse_str () zu verwenden, um die Abfrageparameter in einem Array zu speichern. Es ist niemals eine gute Idee, Variablen magisch aus dem Nichts erscheinen zu lassen.
Mellowsoon
2
Ein schnelles einfaches Beispiel , warum parse_str mit () 's ‚magischen Variablen‘ ist keine gute Idee -> pastebin.com/AtaaPH4r
mellowsoon
1
@Qualcuno - natürlich nicht. Dies ist speziell für das Abrufen von "get Variablen" - per OP. Ihre Beispiele sind keine Variablen.
Peter Ajtai
154
preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#", $url, $matches);

Dies wird erklären

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}

Ich habe es leicht verbessert, um Folgendes zu unterstützen: http://www.youtube.com/v/5xADESocujo?feature=autoshare&version=3&autohide=1&autoplay=1

Die Zeile, die ich jetzt benutze, ist:

preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+(?=\?)|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#", $link, $matches);
Anthony Leach
quelle
3
Ich habe es aktualisiert, um auch URLs wie diese zu verarbeiten: youtube.com/embed/7zuAOomfiCc #(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+(?=\?)|(?<=embed/)[^&\n]+|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#
simonbs
11
Dies funktioniert für alle URLs, einschließlich eingebetteter Zeichenfolgen (?<=(?:v|i)=)[a-zA-Z0-9-]+(?=&)|(?<=(?:v|i)\/)[^&\n]+|(?<=embed\/)[^"&\n]+|(?<=(?:v|i)=)[^&\n]+|(?<=youtu.be\/)[^&\n]+ rubular.com/r/M9PJYcQxRW
Rob
3
wie wäre es damit /(youtu\.be\/|youtube\.com\/(watch\?(.*&)?v=|(embed|v|user)\/))([^\?& "' >] +) /
bokor
2
Tatsächlich füllt @ bokors Code das $matchesArray mit weiteren Informationen, einschließlich der Video-ID, die für mein Projekt sehr nützlich war
cronoklee
2
Die Erweiterung des regulären Ausdrucks von Rob & list wurde ebenfalls erfasst. Dies wird im folgenden regulären Ausdruck entfernt: # (? <= (?: V | i) =) [a-zA-Z0-9 -_] + | (? <= (?: V | i) \ /) [^ &? \ n] + | (? <= einbetten \ /) [^ "&? \ n] + | (? <= ‌ (?: v | i) =) [^ &? \ n] + | (? <= youtu.be \ /) [^ &? \ n] + # Jetzt unterstützt: youtu.be/RRyG_mtYieI?list=PLnBXpb1YLPttKF7RZX64qI_AEyFjTvgtx youtube.com/… ‌ _AEyFjTvgtx //www.youtube.com RRyG_mtYieI? List = PLnBXpb1YLPttKF7RZX64qI_AEyFjTvgtx youtube.com/v/RRyG_mtYieI
Rick de Graaf
100

Basierend auf Bokors Kommentar zu Anthonys Antwort:

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

$matches[1] enthält das vidid

Streichhölzer:

Stimmt nicht überein:

  • www.facebook.com?wtv=youtube.com/v/vidid
Shawn
quelle
Haben Sie eine C / objc / c ++ - Version dieser Zeichenfolge? Ich weiß nicht, welchen Teilen ich entkommen soll.
João Nunes
Ich habe versucht: "^ (?: Http (?: S) ?: //)? (?: Www \\.)? (?: Youtu \\. Be / | youtube \\. Com / (? :(? : watch)? \? (?:. * &)? v (?: i)? = | (?: embedded | v | vi | user) /)) ([^ \? & \ "'>] +) "Nicht alle Ihre Beispiele übergeben
João Nunes
1
Ich habe mein Problem gefunden. hier ist es die letzte c-Zeichenfolge: "^ (?: http (?: s) ?: //)? (?: www \\.)? (?: youtu \\. be / | youtube \\. com / (? :(?: watch)? \\? (?:. * &)? v (?: i)? = | (?: embedded | v | vi | user) /)) ([^ \? & \ "'>] +)"
João Nunes
Um auch URLs wie youtube.com/watch?v=vidid#action=share zu berücksichtigen, habe ich Folgendes #zur End-Capture-Gruppe hinzugefügt :preg_match("/^(?:http(?:s)?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user)\/))([^\?#&\"'>]+)/", $url, $matches);
Joshangell
1
Es fügt Inhalte mit Leerzeichen hinzu und erfasst den gesamten Text nach einer URL auf einer Seite. Das ist besser / (?: Http (?: S) ?: \ / \ /)? (?: Www \.)? (?: M \.)? (?: Youtu \ .be \ / | youtube \. com \ / (? :(?: watch)? \? (?:. * &)? v (?: i)? = | (?: embedded | v | vi | user) \ /)) ([a- zA-Z0-9 \ -_] *) /
Gino
36

Dies kann sehr einfach mit parse_str und parse_url erreicht werden und ist meiner Meinung nach zuverlässiger.

Meine Funktion unterstützt die folgenden URLs:

Enthält auch den Test unterhalb der Funktion.

/**
 * 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
quelle
Das ist wirklich großartig und funktioniert auch für Vimeo-Videos
Chris James Champeau
1
Dies ist auch meine bevorzugte Antwort. Es deckt sowohl YouTube als auch Vimeo ab. Eine Anmerkung, ich habe eine super kleine Änderung mit einem zusätzlichen isset () hinzugefügt - sonst wenn (isset ($ qs ['vi'])). Vielen Dank dafür.
Spedley
23

LÖSUNG Für jeden Link-Typ !! ::

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

Ausgänge: GvJehZx3eQ1

T.Todua
quelle
13

behoben basierend auf Wie werden YouTube-Video-IDs überprüft?

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

Wir wissen, dass die Video-ID 11 Zeichen lang ist und vor v=oder vi=oder v/oder vi/oder stehen kann youtu.be/. Der einfachste Weg, dies zu tun:

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

Und Ausgabe:

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
quelle
9

Das Folgende funktioniert für alle YouTube-Links

<?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
quelle
4
if (preg_match('![?&]{1}v=([^&]+)!', $url . '&', $m))
    $video_id = $m[1];
NullUserException
quelle
Danke, das hat gut für mich funktioniert, da ich alle Domains, http und https und jede Art von anderem Mist in der URL haben wollte.
MakuraYami
4
(?<=\?v=)([a-zA-Z0-9_-]){11}

Dies sollte es auch tun.

kyri
quelle
4

Ich hatte einige Post-Inhalte, die ich durchgehend verschlüsseln musste, um die Youtube-ID zu erhalten. Es war zufällig in Form des <iframe>Einbettungscodes, den Youtube bereitstellt.

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

Das folgende Muster habe ich von @rob oben bekommen. Das Snippet führt eine foreachSchleife durch, sobald die Übereinstimmungen gefunden wurden, und für einen zusätzlichen Bonus habe ich es mit dem Vorschaubild auf Youtube verknüpft. Es könnte möglicherweise mehr Arten von Youtube-Einbettungstypen und URLs entsprechen:

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

Robs Profil: https://stackoverflow.com/users/149615/rob

Foxinni
quelle
4

Zum Extrahieren von idin einer Erfassungsgruppe kann auch der folgende Ausdruck oder eine Ableitung davon eine Option sein:

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

Demo

Prüfung

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

Ausgabe

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

Wenn Sie den Ausdruck vereinfachen / ändern / untersuchen möchten, wurde dies im oberen rechten Bereich von regex101.com erläutert . Wenn Sie möchten , können Sie in diesem Link auch sehen , wie es mit einigen Beispieleingaben übereinstimmt.


RegEx Circuit

jex.im visualisiert reguläre Ausdrücke:

Geben Sie hier die Bildbeschreibung ein


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

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

Ich weiß, dass sich der Titel des Threads auf die Verwendung einer Regex bezieht, aber genau wie das Zawinski-Zitat sagt, denke ich wirklich, dass es hier am besten ist, Regexe zu vermeiden. Ich würde stattdessen diese Funktion empfehlen:

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

}

Ich empfehle dies, da die ID von YouTube-Videos immer gleich ist, unabhängig vom Stil der URL, z

  • http://www.youtube.com/watch?v=t_uW44Bsezg
  • http://www.youtube.com/watch?feature=endscreen&v=Id3xG4xnOfA&NR=1
  • `Und andere Ulr-Form, in der das Wort" einbetten / "vor die ID gestellt wird ... !!

und das könnte bei eingebetteten und iframe-ed-Sachen der Fall sein .

DreamLordOneiros
quelle
0

Ich habe dies gerade online unter http://snipplr.com/view/62238/get-youtube-video-id-very-robust/ gefunden.

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
quelle
0

Ich habe die Daten aus Shawns Antwort verwendet, aber den regulären Ausdruck ein wenig verallgemeinert und verkürzt. Der Hauptunterschied zu diesem ist, dass es nicht nach einer gültigen Youtube-URL sucht, sondern nur nach einer Video-ID sucht. Dies bedeutet, dass weiterhin eine Video-ID für zurückgegeben wird www.facebook.com?wtv=youtube.com/v/vidid. Funktioniert für alle Testfälle, ist aber etwas lockerer. Folglich wird für so etwas ein falsches Positiv ausgegeben https://www.twitter.com/watch?v=vidid. Verwenden Sie diese Methode, wenn die Daten sehr inkonsistent sind, andernfalls verwenden Sie einen spezifischeren regulären Ausdruck oder parse_url()und parse_str().

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

Ich denke, Sie versuchen das zu tun.

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

und was ist, wenn ich eine youtue-URL aus einer Zeichenfolge voller anderer Zeichen extrahieren möchte? so was:

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud Übung ullamco https://www.youtube.com/watch?v=cPW9Y94BJI0 laboris nisi ut aliquip ex ea Commodo Konsequenz. 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.

und https://www.youtube.com/watch?v=cPW9Y94BJI0 von dieser Zeichenfolge erhalten?

Guillermo Esquivel
quelle
0

Verwenden Sie diesen 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'];

Ergebnis: C4kxS1ksqtw

schau Dev
quelle