PHP Regex, aby uzyskać identyfikator wideo YouTube?

137

Czy ktoś może mi pokazać, jak wyciągnąć identyfikator youtube z adresu URL, niezależnie od tego, jakie inne zmienne GET znajdują się w adresie URL.

Użyj tego filmu na przykład: http://www.youtube.com/watch?v=C4kxS1ksqtw&feature=related
Więc między v=i przed następnym&

wesbos
źródło
1
Powinieneś spojrzeć na mój kod github.com/lingtalfi/video-ids-and-thumbnails/blob/master/… , zapewniam funkcje, które wyodrębniają id z youtube, vimeo i dailymotion.
trwa
@ling w funkcji getVideoThumbnailByUrl () używałeś przestarzałej file_get_contents () dla Vimeo. Ten zamiennik będzie działał wszędzie:$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 Również w getYoutubeId ($ url) warunek końcowy zaakceptuje dowolny ciąg i potwierdzi go jako identyfikator YT. Podałem go jako „śmieci” i zwrócił śmieci jako identyfikator przeanalizowany z tego ciągu.
jerrygarciuh
@jerrygarciuh: afaik file_get_contents nie jest przestarzały, możesz zgłosić problem na github, jeśli miałeś problem z tą funkcją. Dzięki za wykrycie błędu w getYoutubeId (poprawiłem go).
trwa

Odpowiedzi:

304

Użyj parse_url () i parse_str () .

(Możesz używać wyrażeń regularnych do prawie wszystkiego, ale bardzo łatwo jest popełnić błąd, więc jeśli istnieją funkcje PHP specjalnie dla tego, co próbujesz osiągnąć, użyj ich.)

parse_url pobiera łańcuch i dzieli go na tablicę zawierającą kilka informacji. Możesz pracować z tą tablicą lub możesz określić jeden element, który chcesz, jako drugi argument. W tym przypadku interesuje nas zapytanie, czyli PHP_URL_QUERY.

Teraz mamy zapytanie, które jest v=C4kxS1ksqtw&feature=relate, ale chcemy tylko część po v=. W tym celu zwracamy się do, parse_strktóre w zasadzie działa jak GETna sznurku. Pobiera ciąg i tworzy zmienne określone w ciągu. W tym przypadku $vi $featurejest tworzony. Interesuje nas tylko $v.

Aby być bezpiecznym, nie chcesz po prostu przechowywać wszystkich zmiennych z parse_urlprzestrzeni nazw (zobacz komentarz Mellowsoon). Zamiast tego przechowuj zmienne jako elementy tablicy, aby mieć kontrolę nad przechowywanymi zmiennymi i nie możesz przypadkowo nadpisać istniejącej zmiennej.

Składając wszystko razem, mamy:

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

Przykład roboczy


Edytować:

hehe - dzięki Charles. Rozśmieszyło mnie to, nigdy wcześniej nie widziałem cytatu Zawinskiego:

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

Peter Ajtai
źródło
1
Chociaż nie używa wyrażenia regularnego (przynajmniej widocznie - nie jestem pewien, jak parse_url()działa pod maską), to jest droga.
Thomas Owens,
11
<Wstaw cytat Zawinskiego tutaj>. Choć z całą powagą, używanie funkcji językowych do wykonania zadania często będzie lepsze niż przeskakiwanie do kółka, którego może wymagać dobry regex.
Charles
1
Sugerowałbym tylko użycie drugiego parametru parse_str () do przechowywania parametrów zapytania w tablicy. Fakt, że zmienne pojawiają się w magiczny sposób z powietrza, nigdy nie jest dobrym pomysłem.
mellowsoon
2
Szybki, prosty przykład, dlaczego używanie „magicznych zmiennych” parse_str () nie jest dobrym pomysłem -> pastebin.com/AtaaPH4r
mellowsoon
1
@Qualcuno - oczywiście, że nie. Dotyczy to w szczególności pobierania „pobierania zmiennych” - zgodnie z PO. Twoje przykłady nie są zmiennymi.
Peter Ajtai
154
preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#", $url, $matches);

To będzie wyjaśniać

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}

Poprawiłem go nieznacznie, aby wspierać: http://www.youtube.com/v/5xADESocujo?feature=autoshare&version=3&autohide=1&autoplay=1

Linia, której teraz używam, to:

preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+(?=\?)|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#", $link, $matches);
Anthony Leach
źródło
3
Zaktualizowałem go, aby obsługiwał również adresy URL takie jak ten: youtube.com/embed/7zuAOomfiCc #(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+(?=\?)|(?<=embed/)[^&\n]+|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#
simonbs,
11
Działa to dla wszystkich adresów URL, w tym ciągów osadzania (?<=(?:v|i)=)[a-zA-Z0-9-]+(?=&)|(?<=(?:v|i)\/)[^&\n]+|(?<=embed\/)[^"&\n]+|(?<=(?:v|i)=)[^&\n]+|(?<=youtu.be\/)[^&\n]+ rubular.com/r/M9PJYcQxRW
Rob
3
co powiesz na to /(youtu\.be\/|youtube\.com\/(watch\?(.*&)?v=|(embed|v|user)\/))([^\?& "' >] +) /
bokor Kwietnia
2
Właściwie kod @ bokor wypełnia $matchestablicę dodatkowymi informacjami, w tym identyfikatorem wideo, który był bardzo przydatny w moim projekcie
cronoklee,
2
Przechwycono również dodanie do wyrażenia regularnego Rob, & list. Jest to usunięte w poniższym wyrażeniu regularnym: # (? <= (?: v | i) =) [a-zA-Z0-9 -_] + | (? <= (?: v | i) \ /) [^ &? \ n] + | (? <= osadz \ /) [^ "&? \ n] + | (? <= ‌ (?: v | i) =) [^ &? \ n] + | (? <youtu.be \ /) [^ & \ n] + # teraz obsługiwane: youtu.be/RRyG_mtYieI?list=PLnBXpb1YLPttKF7RZX64qI_AEyFjTvgtx youtube.com/... _AEyFjTvgtx //www.youtube.com/embed/ RRyG_mtYieI? List = PLnBXpb1YLPttKF7RZX64qI_AEyFjTvgtx youtube.com/v/RRyG_mtYieI
Rick de Graaf
100

Na podstawie komentarza Bokora do odpowiedzi Anthony'ego:

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

$matches[1] zawiera plik vidid

Mecze:

Nie pasuje:

  • www.facebook.com?wtv=youtube.com/v/vidid
Shawn
źródło
Czy masz wersję tego ciągu w języku C / objc / c ++? nie wiem, z których części uciec.
João Nunes
Próbowałem: „^ (?: Http (?: S)?: //)? (?: Www \\.)? (?: Youtu \\. Be / | youtube \\. Com / (? :(? : watch)? \? (?:. * &)? v (?: i)? = | (?: embed | v | vi | użytkownik) /)) ([^ \? & \ "'>] +) „Nie podając wszystkich przykładów
João Nunes
1
Znalazłem swój problem. tutaj jest końcowy ciąg c: "^ (?: http (?: s)?: //)? (?: www \\.)? (?: youtu \\. be / | youtube \\. com / (? :( ?: watch)? \\? (?:. * &)? v (?: i)? = | (?: embed | v | vi | user) /)) ([^ \? & \ "'>] +)"
João Nunes
Aby uwzględnić również adresy URL, takie jak youtube.com/watch?v=vidid#action=share , dodałem #do końcowej grupy przechwytywania:preg_match("/^(?:http(?:s)?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user)\/))([^\?#&\"'>]+)/", $url, $matches);
joshangell Kwietnia
1
Dodaje zawartość ze spacją i pobiera cały tekst po adresie URL na stronie. To jest lepsze / (?: http (?: S)?: \ / \ /)? (?: www \.)? (?: m \.)? (?: youtu \ .be \ / | youtube \. com \ / (? :( ?: watch)? \? (?:. * &)? v (?: i)? = | (?: embed | v | vi | user) \ /)) ([a- zA-Z0-9 \ -_] *) /
Gino
36

Można to bardzo łatwo osiągnąć za pomocą parse_str i parse_url i moim zdaniem jest to bardziej niezawodne.

Moja funkcja obsługuje następujące adresy URL:

Obejmuje również test poniżej funkcji.

/**
 * 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
źródło
To jest naprawdę świetne i działa również w przypadku filmów vimeo
Chris James Champeau
1
To także moja preferowana odpowiedź. Obejmuje zarówno YouTube, jak i Vimeo. Jedna uwaga, dodałem super drobną poprawkę z dodatkowym isset () - w przeciwnym razie (isset ($ qs ['vi'])). Wielkie dzięki za to.
spedley
23

ROZWIĄZANIE Dla każdego typu łącza !! :

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

wyjścia: GvJehZx3eQ1

T.Todua
źródło
13

naprawiono na podstawie Jak sprawdzić identyfikatory wideo YouTube?

<?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
źródło
9

Wiemy, że identyfikator wideo ma długość 11 znaków i może być poprzedzony znakiem v=lub vi=lub v/lub vi/lub youtu.be/. A więc najprostszy sposób na zrobienie tego:

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

I wyjście:

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
źródło
9

Poniższe będzie działać dla wszystkich linków do youtube

<?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
źródło
4
if (preg_match('![?&]{1}v=([^&]+)!', $url . '&', $m))
    $video_id = $m[1];
NullUserException
źródło
Dzięki, to zadziałało dobrze, ponieważ chciałem wszystkie domeny, http i https oraz wszelkiego rodzaju inne bzdury w adresie URL.
MakuraYami
4
(?<=\?v=)([a-zA-Z0-9_-]){11}

To też powinno wystarczyć.

kyri
źródło
4

Miałem treść posta, którą musiałem zaszyfrować, aby usunąć identyfikator YouTube. Zdarzyło się to w postaci <iframe>kodu do umieszczenia na stronie, który zapewnia YouTube.

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

Poniższy wzór otrzymałem z @rob powyżej. Fragment wykonuje foreachpętlę po znalezieniu meczów, a dla dodatkowego bonusu połączyłem go z obrazem podglądu znalezionym na Youtube. Potencjalnie może pasować do większej liczby typów osadzania YouTube i adresów URL:

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

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

Foxinni
źródło
4

Aby wyodrębnić idw grupie przechwytywania, następujące wyrażenie lub jego pochodna może być również opcją:

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

Próbny

Test

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

Wynik

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

Jeśli chcesz uprościć / zmodyfikować / zbadać wyrażenie, zostało to wyjaśnione w prawym górnym panelu regex101.com . Jeśli chcesz, możesz również obejrzeć w tym linku , jak to będzie się zgadzać z niektórymi przykładowymi danymi wejściowymi.


RegEx Circuit

jex.im wizualizuje wyrażenia regularne:

wprowadź opis obrazu tutaj


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

$vid = preg_replace('/[^\w\-\_].*$/', '', $vid);  // Strip trailing meuk.
pieter
źródło
2

Wiem, że tytuł wątku odnosi się do użycia wyrażenia regularnego, ale tak jak mówi cytat Zawinski, naprawdę uważam, że unikanie wyrażeń regularnych jest tutaj najlepsze. Poleciłbym zamiast tego tę funkcję:

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

}

Polecam, ponieważ identyfikator filmów z YouTube jest zawsze taki sam, niezależnie od stylu adresu URL, np

  • http://www.youtube.com/watch?v=t_uW44Bsezg
  • http://www.youtube.com/watch?feature=endscreen&v=Id3xG4xnOfA&NR=1
  • `I inna forma Ulr, w której słowo" embed / "jest umieszczone przed Id ... !!

i tak może być w przypadku elementów osadzonych i osadzonych iframe.

DreamLordOneiros
źródło
0

Właśnie znalazłem to w Internecie pod adresem http://snipplr.com/view/62238/get-youtube-video-id-very-robust/

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
źródło
0

Użyłem danych z odpowiedzi Shawna, ale uogólniłem i trochę skróciłem wyrażenie regularne. Kluczowa różnica w tym przypadku polega na tym, że nie będzie testować prawidłowego adresu URL YouTube, po prostu szuka identyfikatora wideo. Oznacza to, że nadal zwróci identyfikator wideo dla www.facebook.com?wtv=youtube.com/v/vidid. Działa we wszystkich przypadkach testowych, ale jest nieco bardziej luźny. W konsekwencji wygeneruje fałszywie dodatni wynik dla czegoś takiego jak https://www.twitter.com/watch?v=vidid. Użyj tej metody, jeśli dane są bardzo niespójne, w przeciwnym razie użyj bardziej szczegółowego wyrażenia regularnego lub parse_url()i parse_str().

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

Myślę, że próbujesz to zrobić.

<?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
źródło
0

a co, jeśli chcę wyodrębnić adres URL youtue z ciągu pełnego innych znaków? lubię to:

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 exercise ullamco https://www.youtube.com/watch?v=cPW9Y94BJI0 laboris nisi ut aliquip ex ea commodo consat. 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.

i uzyskać https://www.youtube.com/watch?v=cPW9Y94BJI0 z tego ciągu?

Guillermo Esquivel
źródło
0

Użyj tego kodu:

$url = "http://www.youtube.com/watch?v=C4kxS1ksqtw&feature=related"; 
$parse = parse_url($url, PHP_URL_QUERY); 
parse_str($parse, $output); 
echo $output['watch'];

wynik: C4kxS1ksqtw

wyglądać Dev
źródło