PHP Regex untuk mendapatkan ID video youtube?

141

Dapatkah seseorang menunjukkan kepada saya cara mengeluarkan id youtube dari url terlepas dari variabel GET lainnya di URL.

Gunakan video ini sebagai contoh: http://www.youtube.com/watch?v=C4kxS1ksqtw&feature=related
Jadi antara v=dan sebelum berikutnya&

wesbos.dll
sumber
1
Anda harus melihat kode saya github.com/lingtalfi/video-ids-and-thumbnails/blob/master/… , saya menyediakan fungsi yang mengekstrak id dari youtube, vimeo dan dailymotion.
ling
@ menggunakan fungsi getVideoThumbnailByUrl () Anda menggunakan file_get_contents () yang tidak digunakan lagi untuk Vimeo. Penggantian ini akan bekerja di mana-mana:$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 Juga di getYoutubeId ($ url), kondisi akhir akan menerima string apa pun dan memvalidasinya sebagai id YT. Saya melewatkannya sebagai 'junk' dan mengembalikan junk sebagai id yang diurai dari string itu.
jerrygarciuh
@jerrygarciuh: afaik file_get_contents tidak digunakan lagi, silakan laporkan masalah di github jika Anda mengalami masalah dengan fungsi ini. Terima kasih telah melihat kesalahan di getYoutubeId (Saya menyempurnakannya).
ling

Jawaban:

309

Gunakan parse_url () dan parse_str () .

(Anda dapat menggunakan regex untuk apa saja, tetapi regex sangat mudah untuk membuat kesalahan, jadi jika ada fungsi PHP khusus untuk apa yang Anda coba capai, gunakan itu.)

parse_url mengambil string dan memotongnya menjadi array yang memiliki banyak info. Anda bisa bekerja dengan larik ini, atau Anda bisa menentukan satu item yang Anda inginkan sebagai argumen kedua. Dalam hal ini kami tertarik dengan kueri, yaitu PHP_URL_QUERY.

Sekarang kami memiliki kueri, yaitu v=C4kxS1ksqtw&feature=relate, tetapi kami hanya menginginkan bagian setelahnya v=. Untuk ini kita beralih ke parse_stryang pada dasarnya berfungsi seperti GETpada string. Dibutuhkan string dan membuat variabel yang ditentukan dalam string. Dalam hal ini $vdan $featuredibuat. Kami hanya tertarik pada $v.

Untuk amannya, Anda tidak ingin hanya menyimpan semua variabel dari parse_urldalam namespace Anda (lihat komentar mellowsoon). Sebaliknya, simpan variabel sebagai elemen larik, sehingga Anda memiliki kendali atas variabel apa yang Anda simpan, dan Anda tidak dapat menimpa variabel yang ada secara tidak sengaja.

Menyatukan semuanya, kami memiliki:

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

Contoh kerja


Edit:

hehe - terima kasih Charles. Itu membuat saya tertawa, saya belum pernah melihat kutipan Zawinski sebelumnya:

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

Peter Ajtai
sumber
1
Meskipun tidak menggunakan regex (setidaknya terlihat - saya tidak yakin bagaimana cara parse_url()kerjanya di bawah tenda), ini adalah cara yang tepat.
Thomas Owens
11
<Masukkan Kutipan Zawinski Di Sini>. Meskipun serius, menggunakan fungsi bahasa untuk melakukan tugas sering kali akan lebih baik daripada lompatan lingkaran yang diperlukan regex yang baik.
Charles
1
Saya hanya menyarankan menggunakan parameter kedua parse_str () untuk menyimpan parameter kueri dalam sebuah array. Memiliki variabel secara ajaib muncul begitu saja bukanlah ide yang baik.
mellowsoon
2
Contoh sederhana yang cepat mengapa menggunakan "variabel ajaib" parse_str () bukanlah ide yang baik -> pastebin.com/AtaaPH4r
mellowsoon
1
@Qualcuno - tentu saja tidak. Ini secara khusus untuk mengambil "get variabel" - sesuai OP. Contoh Anda tidak mendapatkan variabel.
Peter Ajtai
155
preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#", $url, $matches);

Ini akan menjelaskan

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}

Saya sedikit meningkatkannya untuk mendukung: http://www.youtube.com/v/5xADESocujo?feature=autoshare&version=3&autohide=1&autoplay=1

Garis yang saya gunakan sekarang adalah:

preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+(?=\?)|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#", $link, $matches);
Anthony Leach
sumber
3
Saya telah memperbaruinya untuk juga menangani URL seperti ini: youtube.com/embed/7zuAOomfiCc #(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+(?=\?)|(?<=embed/)[^&\n]+|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#
simonbs
11
Ini berfungsi untuk semua url, termasuk string yang disematkan (?<=(?:v|i)=)[a-zA-Z0-9-]+(?=&)|(?<=(?:v|i)\/)[^&\n]+|(?<=embed\/)[^"&\n]+|(?<=(?:v|i)=)[^&\n]+|(?<=youtu.be\/)[^&\n]+ rubular.com/r/M9PJYcQxRW
Rob
3
bagaimana dengan /(youtu\.be\/ incredyoutube\.com\/(watch\?(.*&)?v=i>(embedi>vi>user)\/))([^\?& "' >] +) /
bokor
2
Sebenarnya kode @ bokor mengisi $matchesarray dengan lebih banyak info, termasuk ID video yang sangat berguna untuk proyek saya
cronoklee
2
Penambahan regex Rob, & daftar juga ditangkap. Ini dihilangkan dalam ekspresi reguler di bawah ini: # (? <= (?: v | i) =) [a-zA-Z0-9 -_] + | (? <= (?: v | i) \ /) [^ &? \ n] + | (? <= embed \ /) [^ "&? \ n] + | (? <= ‌ (?: v | i) =) [^ &? \ n] + | (? <= youtu.be \ /) [^ &? \ n] + # Sekarang didukung: 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
102

Berdasarkan komentar bokor atas jawaban Anthony:

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

$matches[1] berisi vidid tersebut

Pertandingan:

Tidak cocok:

  • www.facebook.com?wtv=youtube.com/v/vidid
Shawn
sumber
Apakah Anda memiliki versi C / objc / c ++ dari string ini? saya tidak tahu bagian mana yang harus melarikan diri.
João Nunes
Saya mencoba: "^ (?: Http (?: S)?: //)? (?: Www \\.)? (?: Youtu \\. Be / | youtube \\. Com / (? :(? : jam tangan)? \? (?:. * &)? v (?: i)? = | (?: embed | v | vi | pengguna) /)) ([^ \? & \ "'>] +) "Tidak memberikan semua contoh Anda
João Nunes
1
Saya menemukan masalah saya. ini dia string c terakhir: "^ (?: http (?: s)?: //)? (?: www \\.)? (?: youtu \\. be / | youtube \\. com / (? :( ?: jam tangan)? \\? (?:. * &)? v (?: i)? = | (?: embed | v | vi | pengguna) /)) ([^ \? & \ "'>] +)"
João Nunes
Untuk juga memperhitungkan url akun seperti youtube.com/watch?v=vidid#action=share, saya telah menambahkan #ke grup tangkapan akhir:preg_match("/^(?:http(?:s)?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user)\/))([^\?#&\"'>]+)/", $url, $matches);
joshangell
1
Itu menambahkan konten dengan ruang dan mengambil semua teks setelah url di halaman. Ini lebih baik / (?: http (?: S)?: \ / \ /)? (?: www \.)? (?: m \.)? (?: youtu \ .be \ / | youtube \. com \ / (? :( ?: jam tangan)? \? (?:. * &)? v (?: i)? = | (?: embed | v | vi | pengguna) \ /)) ([a- zA-Z0-9 \ -_] *) /
Gino
38

Ini bisa sangat mudah dilakukan dengan menggunakan parse_str dan parse_url dan menurut saya lebih dapat diandalkan.

Fungsi saya mendukung url berikut:

Juga termasuk tes di bawah fungsi.

/**
 * 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
sumber
Ini sangat bagus dan benar-benar berfungsi untuk video vimeo juga
Chris James Champeau
1
Ini juga jawaban pilihan saya. Itu mencakup YouTube dan Vimeo. Satu catatan, saya menambahkan tweak super minor dengan isset tambahan () - else if (isset ($ qs ['vi'])). Terima kasih banyak untuk ini.
spedley
ini luar biasa. Terima kasih banyak.
Ruhith Udakara
23

SOLTUION Untuk semua jenis link !! :

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

keluaran: GvJehZx3eQ1

T.Todua
sumber
13

diperbaiki berdasarkan Bagaimana cara memvalidasi id video 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
sumber
9

Kami tahu bahwa ID video memiliki panjang 11 karakter dan dapat diawali dengan v=atau vi=atau v/atau vi/atau youtu.be/. Jadi cara termudah untuk melakukan ini:

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

Dan keluaran:

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

Perintah berikut akan berfungsi untuk semua tautan 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
sumber
6

Untuk mengekstraksi idin a capturing group, ekspresi berikut atau beberapa turunannya mungkin juga menjadi pilihan:

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

Demo

Uji

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

Keluaran

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

Jika Anda ingin menyederhanakan / memodifikasi / menjelajahi ekspresi, itu telah dijelaskan di panel kanan atas regex101.com . Jika mau, Anda juga dapat melihat di tautan ini , bagaimana kecocokannya dengan beberapa masukan sampel.


Sirkuit RegEx

jex.im memvisualisasikan ekspresi reguler:

masukkan deskripsi gambar di sini


Emma
sumber
4
if (preg_match('![?&]{1}v=([^&]+)!', $url . '&', $m))
    $video_id = $m[1];
NullUserException
sumber
Terima kasih, Ini bekerja dengan baik untuk saya karena saya ingin semua domain, http dan https, dan segala jenis omong kosong lainnya di url.
MakuraYami
4
(?<=\?v=)([a-zA-Z0-9_-]){11}

Ini harus dilakukan juga.

kyri
sumber
4

Saya memiliki beberapa konten kiriman yang harus saya sandi untuk mendapatkan ID Youtube-nya. Kebetulan dalam bentuk <iframe>kode sematan yang disediakan Youtube.

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

Pola berikut saya dapatkan dari @rob di atas. Cuplikan melakukan foreachloop setelah kecocokan ditemukan, dan untuk bonus tambahan saya menautkannya ke gambar pratinjau yang ditemukan di Youtube. Ini berpotensi cocok dengan lebih banyak jenis jenis sematan dan url Youtube:

$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 Rob: https://stackoverflow.com/users/149615/rob

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

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

Saya tahu bahwa judul utas merujuk pada penggunaan regex, tetapi seperti yang dikatakan kutipan Zawinski, menurut saya menghindari regex adalah yang terbaik di sini. Saya akan merekomendasikan fungsi ini sebagai gantinya:

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

}

Saya merekomendasikan ini karena ID video YouTube selalu sama, terlepas dari gaya URL, mis

  • http://www.youtube.com/watch?v=t_uW44Bsezg
  • http://www.youtube.com/watch?feature=endscreen&v=Id3xG4xnOfA&NR=1
  • ʻAnd Bentuk Ulr Lainnya Di Mana Kata "embed /" Ditempatkan Sebelum Id ... !!

dan itu mungkin kasus untuk hal-hal yang disematkan dan disematkan iframe.

DreamLordOneiros
sumber
1

Gunakan kode ini:

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

hasil: C4kxS1ksqtw

Dev yang tampan
sumber
0

Baru saja menemukannya online di 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
sumber
0

Saya menggunakan data dari jawaban Shawn tetapi menggeneralisasi dan memperpendek regex sedikit. Perbedaan utama dengan yang satu ini adalah bahwa itu tidak akan menguji URL Youtube yang valid, itu hanya akan mencari ID video. Artinya itu masih akan mengembalikan ID video untuk www.facebook.com?wtv=youtube.com/v/vidid. Bekerja untuk semua kasus pengujian, tetapi sedikit lebih longgar. Akibatnya, ini akan menghasilkan positif palsu untuk sesuatu seperti https://www.twitter.com/watch?v=vidid. Gunakan metode ini jika datanya sangat tidak konsisten, jika tidak, gunakan regex atau parse_url()dan parse_str().

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

Saya pikir Anda mencoba melakukan ini.

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

dan bagaimana jika saya ingin mengekstrak url youtue dari string yang penuh dengan karakter lain? seperti ini:

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 konsekuensi. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Kecuali terjadi cupidatat nonproident, yang dilakukan di kantor pusat dari pekerja di luar negeri.

dan dapatkan https://www.youtube.com/watch?v=cPW9Y94BJI0 dari string itu?

Guillermo Esquivel
sumber