Youtube video kimliği almak için PHP Regex?


137

Birisi bana URL'de diğer GET değişkenlerinin ne olduğuna bakılmaksızın youtube kimliğini bir URL'den nasıl çıkaracağımı gösterebilir.

Örneğin bu videoyu kullanın: http://www.youtube.com/watch?v=C4kxS1ksqtw&feature=related
Yani bir v=sonraki ve bir sonraki&



1
Benim kod github.com/lingtalfi/video-ids-and-thumbnails/blob/master/… bakmak gerekir , ben youtube, vimeo ve dailymotion kimliğini ayıklamak fonksiyonları sağlamak.
ling

@ling in getvideoThumbnailByUrl () işlevinde, Vimeo için kullanımdan kaldırılmış file_get_contents () kullanıyordunuz. Bu değiştirme her yerde çalışacaktır:$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 Ayrıca getYoutubeId'de ($ url) son koşul herhangi bir dizeyi kabul eder ve onu bir YT kimliği olarak doğrular. Ben 'önemsiz' geçti ve o dizeden ayrıştırılmış bir kimlik olarak önemsiz döndü.
jerrygarciuh

@jerrygarciuh: afaik file_get_contents kullanımdan kaldırılmadı, bu işlevle ilgili sorun yaşarsanız github ile ilgili bir sorunu bildirmekten çekinmeyin. GetYoutubeId'deki hatayı tespit ettiğiniz için teşekkürler (geliştirdim).
Ling

Yanıtlar:


305

Parse_url () ve parse_str () kullanın .

(Regexes'i hemen hemen her şey için kullanabilirsiniz, ancak bir hata yapmak çok kolaydır, bu nedenle özellikle yapmaya çalıştığınız şey için PHP işlevleri varsa, bunları kullanın.)

parse_url bir dize alır ve bir sürü bilgi içeren bir diziye ayırır. Bu diziyle çalışabilir veya ikinci bağımsız değişken olarak istediğiniz bir öğeyi belirtebilirsiniz. Bu durumda, sorguyla ilgileniyoruz PHP_URL_QUERY.

Şimdi sorgumuz var v=C4kxS1ksqtw&feature=relate, ama sadece parçayı istiyoruz v=. Bunun için parse_strtemelde bir ipte olduğu gibi çalışırız GET. Bir dize alır ve dizede belirtilen değişkenleri oluşturur. Bu durumda $vve $featureoluşturulur. Sadece ilgileniyoruz $v.

Güvende olmak için, tüm değişkenleri parse_urlad alanınızda saklamak istemezsiniz (mellowsoon'un yorumuna bakın). Bunun yerine, değişkenleri bir dizinin öğeleri olarak depolayın, böylece hangi değişkenleri sakladığınızı kontrol edebilirsiniz ve yanlışlıkla mevcut bir değişkenin üzerine yazamazsınız.

Her şeyi bir araya getirirsek, elimizde:

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

Çalışma örneği


Düzenle:

hehe - teşekkürler Charles. Bu beni güldürdü, daha önce Zawinski'nin sözünü hiç görmedim:

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


1
Regex kullanmasa da (en azından görünür şekilde - parse_url()kaputun altında nasıl çalıştığından emin değilim ), bu yol.
Thomas Owens

11
<Zawinski Sözünü Buraya Ekle>. Tüm ciddiyette olsa da, bir görevi yerine getirmek için dil işlevlerini kullanmak genellikle iyi bir normal ifadenin gerektirebileceği çember atlamadan daha iyi olacaktır.
Charles

1
Sadece bir dizide sorgu parametrelerini saklamak için parse_str () 'in ikinci parametresini kullanmanızı öneririm. Değişkenlerin ince havadan dışarı çıkması asla iyi bir fikir değildir.
mellowsoon

2
Parse_str () 'nin "sihirli değişkenleri" ni kullanmanın iyi bir fikir olmadığını gösteren hızlı ve basit bir örnek -> pastebin.com/AtaaPH4r
mellowsoon 19:10

1
@Qualcuno - tabii ki hayır. Bu, OP başına "get değişkenlerini" almak içindir. Örnekleriniz get değişkenleri değil.
Peter Ajtai

154
preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#", $url, $matches);

Bu,

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}

Desteklemek için biraz geliştirdim: http://www.youtube.com/v/5xADESocujo?feature=autoshare&version=3&autohide=1&autoplay=1

Şimdi kullandığım çizgi:

preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+(?=\?)|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#", $link, $matches);

3
Ben de böyle URL'leri işlemek için güncelledim: youtube.com/embed/7zuAOomfiCc #(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+(?=\?)|(?<=embed/)[^&\n]+|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#
simonbs

11
Bu, tüm URL'ler için geçerlidir, gömme dizeleri (?<=(?:v|i)=)[a-zA-Z0-9-]+(?=&)|(?<=(?:v|i)\/)[^&\n]+|(?<=embed\/)[^"&\n]+|(?<=(?:v|i)=)[^&\n]+|(?<=youtu.be\/)[^&\n]+ rubular.com/r/M9PJYcQxRW
Rob

3
buna ne dersin /(youtu\.be\/|youtube\.com\/(watch\?(.*&)?v=|(embed|v|user)\/))([^\?& " >] +) /
bokor

2
Aslında @ bokor'un kodu $matches, projem için çok yararlı olan video kimliği de dahil olmak üzere diziyi daha fazla bilgi ile
dolduruyor

2
Rob ve listesinin normal ifadesine ek olarak da yakalandı. Bu, aşağıdaki normal ifadede çıkarılmıştır: # (? <= (?: v | i) =) [a-zA-Z0-9 -_] + | (? <= (?: v | i) \ /) [^ &? \ n] + | [^ "\ & n?] + (<= yerleştirme \ /?) | (<= (:? h | i) =) [? ^ & \ n] + | (? <= youtu.be \ /) [^ &? \ n] + # Şimdi destekleniyor: youtu.be/RRyG_mtYieI?list=PLnBXpb1YLPttKF7RZX64qI_AEyFjTvgtx youtube.com/… ‌ _AEyFjTvgtx/w.yow.utube/ RRyG_mtYieI? List = PLnBXpb1YLPttKF7RZX64qI_AEyFjTvgtx youtube.com/v/RRyG_mtYieI
Rick de Graaf

101

Bokor'un Anthony'nin cevabı hakkındaki yorumuna dayanarak:

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

$matches[1] vidid içerir

Maçlar:

Eşleşmiyor:

  • www.facebook.com?wtv=youtube.com/v/vidid

Bu dizenin C / objc / c ++ sürümünüz var mı? Hangi parçalardan kaçacağımı bilmiyorum.
João Nunes

Denedim: "^ (?: Http (?: S)?: //)? (?: Www \\.)? (?: Youtu \\. Be / | youtube \\. Com / (? :(? : izle) \ (: * &) v (i) = | (?:?.???? gömmek | v | vi | kullanıcı) /)) ([? ^ \ & \ " '>] +) "Tüm örneklerinizi
João Nunes

1
Sorunumu buldum. işte son c string: "^ (?: http (?: s)?: //)? (?: www \\.)? (?: youtu \\. be / | youtube \\. com / \\ (: * &.) v: = (:( ?: izle?)??? (i?) |? (?: gömmek | v | vi | kullanıcı) /)) ([^ \ & \? "'>] +)"
João Nunes

Ayrıca gibi hesap URL'ler içine çekmek için youtube.com/watch?v=vidid#action=share Eklediğim #biten yakalama grubuna:preg_match("/^(?:http(?:s)?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user)\/))([^\?#&\"'>]+)/", $url, $matches);
joshangell

1
Boşluk içeren içerik ekler ve sayfadaki bir URL'den sonra tüm metni alır. Bu daha iyi / (?: http (?: S)?: \ / \ /)? (?: www \.)? (?: m \.)? (?: youtu \ .be \ / | youtube \. com \ / \: v: = (:( ?: izle?)? (* &.)? (i?) |? (?: gömmek | v | vi | kullanıcı) \ /)) ([a- zA-Z0-9 \ -_] *) /
Gino

36

Bu, parse_str ve parse_url kullanılarak çok kolay bir şekilde gerçekleştirilebilir ve bence daha güvenilirdir.

İşlevim aşağıdaki URL'leri destekliyor:

Ayrıca fonksiyonun altındaki testi de içerir.

/**
 * 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";
}

Bu gerçekten harika ve aslında vimeo videoları için de çalışıyor
Chris James Champeau

1
Bu da benim tercih ettiğim cevap. Hem YouTube'u hem de Vimeo'yu kapsar. Bir not, ek bir isset () ile süper küçük bir tweak ekledim - aksi takdirde (isset ($ qs ['vi'])). Bunun için çok teşekkürler.
spedley

23

ÇÖZÜM Herhangi bir bağlantı türü için !! :

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

çıktılar: GvJehZx3eQ1


13

dayalı sabit Youtube video kimlikleri doğrulamak için nasıl?

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

9

Video kimliğinin 11 karakter uzunluğunda olduğunu ve öncesinde v=veya vi=veya v/veya vi/veya olabileceğini biliyoruz youtu.be/. Bunu yapmanın en basit yolu:

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

Ve çıktı:

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

9

Aşağıdaki tüm youtube bağlantıları için çalışacaktır

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

4
if (preg_match('![?&]{1}v=([^&]+)!', $url . '&', $m))
    $video_id = $m[1];

Teşekkürler, Tüm etki alanları, http ve https ve url'deki diğer her türlü saçmalık istediğim için bu benim için iyi çalıştı.
MakuraYami

4
(?<=\?v=)([a-zA-Z0-9_-]){11}

Bunu da yapmalı.


4

Youtube kimliğini çıkarmak için şifrelemek zorunda olduğum bazı yayın içeriğim vardı. <iframe>Youtube'un sağladığı gömme kodu şeklinde oldu .

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

Aşağıdaki desen yukarıda @rob aldım. Snippet foreach, eşleşmeler bulunduğunda bir döngü yapar ve ek bir bonus için Youtube'da bulunan önizleme görüntüsüne bağladım. Potansiyel olarak daha fazla Youtube yerleştirme türü ve URL'si ile eşleşebilir:

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

Rob adlı kişinin profili: https://stackoverflow.com/users/149615/rob


4

idBir yakalama grubunda ayıklamak için , aşağıdaki ifade veya bunun bir türevi de bir seçenek olabilir:

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

gösteri

Ölçek

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

Çıktı

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

İfadeyi basitleştirmek / değiştirmek / keşfetmek istiyorsanız, regex101.com'un sağ üst panelinde açıklanmıştır . İsterseniz, bu bağlantıda bazı örnek girdilerle nasıl eşleşeceğini de izleyebilirsiniz .


RegEx Devresi

jex.im düzenli ifadeleri görselleştirir:

resim açıklamasını buraya girin



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

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

2

İş parçacığının başlığının bir regex kullanımını ifade ettiğini biliyorum, ancak Zawinski alıntısının söylediği gibi, gerçekten regex'lerden kaçınmanın en iyisi olduğunu düşünüyorum. Bunun yerine bu işlevi tavsiye ederim:

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

}

Bunu tavsiye ederim çünkü YouTube videolarının kimliği her zaman aynıdır, URL'nin stilinden bağımsızdır, ör.

  • http://www.youtube.com/watch?v=t_uW44Bsezg
  • http://www.youtube.com/watch?feature=endscreen&v=Id3xG4xnOfA&NR=1
  • `Ve" Gömme / "Kelimesinin Kimliğe Yerleştirildiği Diğer Ulr Formu ... !!

ve bu gömülü ve iframe-ed şeyler için geçerli olabilir.


0

Bunu çevrimiçi olarak http://snipplr.com/view/62238/get-youtube-video-id-very-robust/ adresinde bulabilirsiniz.

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

0

Shawn'un cevabındaki verileri kullandım ama normal ifadeyi biraz genelleştirip kısalttım. Buradaki en önemli fark, geçerli bir Youtube URL'sini test etmemesi, sadece bir video kimliği arayacağıdır. Bu, için hala bir video kimliği döndüreceği anlamına gelir www.facebook.com?wtv=youtube.com/v/vidid. Tüm test vakaları için çalışır, ancak biraz daha gevşek. Sonuç olarak, böyle bir şey için yanlış pozitif çıkacaktır https://www.twitter.com/watch?v=vidid. Veriler süper tutarsızsa bu yöntemi kullanın, aksi takdirde daha spesifik bir normal ifade veya parse_url()ve kullanın parse_str().

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

0

Bence bunu yapmaya çalışıyorsun.

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

0

ve diğer karakterlerle dolu bir dizeden bir youtue url'si çıkarmak istersem ne olur? bunun gibi:

Lorem ipsum dolor sit amet, adipiscing elit, sed do eiusmod tempor incididunt ut labore ve dolore magna aliqua. Ut enim ad minim veniam, nostud exercitation ullamco https://www.youtube.com/watch?v=cPW9Y94BJI0 labouris nisi ut aliquip ex ea commodo resultsat. Voluptate velit esse cillum dolore eu fugiat nulla pariatur içinde reprehenderit içinde Duis aute irure dolor. Dışlayıcı sint occaecat cupidatat non proident, culpa qui officia deserunt mollit anim id est laborum sunt.

ve bu dizeden https://www.youtube.com/watch?v=cPW9Y94BJI0 olsun ?


0

Bu kodu kullanın:

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

sonuç: C4kxS1ksqtw

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.