PHP Regex để lấy ID video youtube?


137

Ai đó có thể chỉ cho tôi cách lấy id youtube ra khỏi url bất kể các biến GET khác có trong URL không.

Sử dụng video này ví dụ: http://www.youtube.com/watch?v=C4kxS1ksqtw&feature=related
Vì vậy, giữa v=và trước tiếp theo&


1
Điều đó có thể hữu ích stackoverflow.com/questions/9522868/ từ

1
Bạn nên xem mã của tôi github.com/lingtalfi/video-ids-and-thumbnails/blob/master/ , tôi cung cấp các hàm trích xuất id từ youtube, vimeo và dailymotion.
ling

@ling trong hàm getVideoThumbnailByUrl () bạn đang sử dụng file_get_contents () không dùng nữa cho Vimeo. Sự thay thế này sẽ hoạt động ở mọi nơi:$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 Ngoài ra, trong getYoutubeId ($ url), điều kiện cuối cùng sẽ chấp nhận bất kỳ chuỗi nào và xác thực nó dưới dạng id YT. Tôi đã chuyển nó 'rác' và nó trả lại rác khi id được phân tích cú pháp từ chuỗi đó.
jerrygarciuh

@jerrygarciuh: afaik file_get_contents không được phản đối, vui lòng báo cáo sự cố trên github nếu bạn gặp vấn đề với chức năng này. Cảm ơn vì đã phát hiện ra lỗi trong getYoutubeId (tôi đã cải thiện nó).
ling

Câu trả lời:


304

Sử dụng parse_url ()parse_str () .

(Bạn có thể sử dụng regexes cho bất cứ thứ gì, nhưng chúng rất dễ gây ra lỗi, vì vậy nếu có các hàm PHP đặc biệt cho những gì bạn đang cố gắng thực hiện, hãy sử dụng chúng.)

parse_url lấy một chuỗi và cắt nó thành một mảng có một loạt thông tin. Bạn có thể làm việc với mảng này hoặc bạn có thể chỉ định một mục bạn muốn làm đối số thứ hai. Trong trường hợp này, chúng tôi quan tâm đến truy vấn, đó là PHP_URL_QUERY.

Bây giờ chúng tôi có truy vấn, đó là v=C4kxS1ksqtw&feature=relate, nhưng chúng tôi chỉ muốn phần sau v=. Đối với điều này, chúng ta chuyển sang parse_strcơ bản hoạt động như GETtrên một chuỗi. Nó nhận một chuỗi và tạo các biến được chỉ định trong chuỗi. Trong trường hợp này $v$featuređược tạo ra. Chúng tôi chỉ quan tâm đến $v.

Để an toàn, bạn không muốn chỉ lưu trữ tất cả các biến từ parse_urltrong không gian tên của mình (xem bình luận của mellow gió). Thay vào đó, lưu trữ các biến dưới dạng các phần tử của một mảng, để bạn có quyền kiểm soát các biến bạn đang lưu trữ và bạn không thể vô tình ghi đè lên một biến hiện có.

Đặt mọi thứ lại với nhau, chúng ta có:

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

Ví dụ làm việc


Biên tập:

hehe - cảm ơn Charles. Điều đó làm tôi bật cười, tôi chưa bao giờ thấy trích dẫn của Zawinski trước đây:

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


1
Mặc dù nó không sử dụng regex (ít nhất là rõ ràng - tôi không chắc cách thức parse_url()hoạt động dưới mui xe), đây là cách để đi.
Thomas Owens

11
<Chèn Zawinski Trích dẫn ở đây>. Mặc dù trong mọi trường hợp, việc sử dụng các chức năng ngôn ngữ để thực hiện một nhiệm vụ thường sẽ tốt hơn so với việc nhảy vòng mà một regex tốt có thể yêu cầu.
Charles

1
Tôi chỉ đề xuất sử dụng tham số thứ hai của parse_str () để lưu các tham số truy vấn trong một mảng. Có các biến kỳ diệu xuất hiện trong không khí mỏng không bao giờ là một ý tưởng tốt.
mellow gió

2
Một ví dụ đơn giản về lý do tại sao sử dụng "biến ma thuật" của parse_str () không phải là một ý tưởng hay -> pastebin.com/AtaaPH4r
mellow gió

1
@Qualcuno - tất nhiên là không. Điều này đặc biệt để truy xuất "lấy biến" - theo OP. Ví dụ của bạn không nhận được biến.
Peter Ajtai

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

Điều này sẽ chiếm

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}

Tôi đã cải thiện nó một chút để hỗ trợ: http://www.youtube.com/v/5xADESocujo?feature=autoshare&version=3&autohide=1&autoplay=1

Dòng tôi sử dụng bây giờ là:

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

3
Tôi đã cập nhật nó để xử lý các URL như thế này: youtube.com/embed/7zuAOomfiCc #(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+(?=\?)|(?<=embed/)[^&\n]+|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#
simonbs

11
Điều này hoạt động cho tất cả các url, bao gồm các chuỗi (?<=(?:v|i)=)[a-zA-Z0-9-]+(?=&)|(?<=(?:v|i)\/)[^&\n]+|(?<=embed\/)[^"&\n]+|(?<=(?:v|i)=)[^&\n]+|(?<=youtu.be\/)[^&\n]+ rubular.com/r/M9PJYcQxRW
Rob

3
làm thế nào về điều này /(youtu\.be\/|youtube\.com\/(watch\?(.*&)?v=|(embed|v|user)\/))([ ^ >] +) /
bokor

2
Trên thực tế, mã của @ bokor điền vào $matchesmảng với nhiều thông tin hơn, bao gồm ID video rất hữu ích cho dự án của tôi
cronoklee

2
Ngoài ra còn có regex của Rob, & list cũng đã bị bắt. Điều này được loại bỏ trong regex bên dưới: # (? <= (?: V | i) =) [a-zA-Z0-9 -_] + | (? <= (?: V | i) \ /) [^ &? \ n] + | (? <= nhúng \ /) [^ "&? \ n] + | (? <= ‌ (?: v | i) =) [^ &? \ n] + | (? <= youtu.be \ /) [? ^ & \ n] + # Bây giờ hỗ trợ: 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

Dựa trên nhận xét của bokor về câu trả lời của Anthony:

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

$matches[1] chứa vidid

Diêm:

Không phù hợp với:

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

Bạn có phiên bản C / objc / c ++ của chuỗi này không? tôi không biết phần nào để trốn thoát.
João Nunes

Tôi đã thử: "^ (?: Http (?: S) ?: //)? (?: Www \.)? (?: Youtu \\. Be / | youtube \\. Com / (? :(? : xem)? \? (?:. * &)? v (?: i)? = | (?: nhúng | v | vi | người dùng) /)) ([^ \? & \ "'>] +) "Không vượt qua tất cả các ví dụ của bạn
João Nunes

1
Tôi tìm thấy vấn đề của tôi. đây là chuỗi c cuối cùng: "^ (?: http (?: s) ?: //)? (?: www \\.)? (?: youtu \\. be / | youtube \\. com / (? :(?: xem)? \\? (?:. * &)? v (?: i)? = | (?: embed | v | vi | user) /)) ([^ \? & \ "'>] +)"
João Nunes

Để cũng tính đến các url như youtube.com/watch?v=vidid#action=share Tôi đã thêm #nhóm chụp kết thúc:preg_match("/^(?:http(?:s)?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user)\/))([^\?#&\"'>]+)/", $url, $matches);
joshangell

1
Nó thêm nội dung với không gian và lấy tất cả văn bản sau một url trên một trang. Điều này tốt hơn / (?: Http (?: S) ?: \ / \ /)? (?: Www \.)? (?: M \.)? (?: Youtu \ .be \ / | youtube \. com \ / (? :(?: xem)? \? (?:. * &)? v (?: i)? = | (?: nhúng | v | vi | người dùng) \ /)) ([a- zA-Z0-9 \ -_] *) /
Gino

36

Điều này có thể được thực hiện rất dễ dàng bằng cách sử dụng parse_strparse_url và theo tôi là đáng tin cậy hơn.

Hàm của tôi hỗ trợ các url sau:

Cũng bao gồm các bài kiểm tra dưới chức năng.

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

Điều này thực sự tuyệt vời và thực sự cũng hoạt động cho các video vimeo
Chris James Champeau

1
Đây cũng là câu trả lời ưa thích của tôi. Nó bao gồm cả YouTube và Vimeo. Một lưu ý, tôi đã thêm một tinh chỉnh siêu nhỏ với một thêmetet () - khác if (isset ($ qs ['vi'])). Rất cám ơn vì điều này.
spedley

23

GIẢI PHÁP Cho bất kỳ loại liên kết !! :

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

đầu ra: GvJehZx3eQ1


13

Đã sửa dựa trên Làm thế nào để xác thực 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));
}

9

Chúng ta biết rằng video ID là 11 ký tự chiều dài và có thể được đi trước bởi v=hoặc vi=hoặc v/hoặc vi/hoặc youtu.be/. Vì vậy, cách đơn giản nhất để làm điều này:

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

Và đầu ra:

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

Sau đây sẽ hoạt động cho tất cả các liên kết 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;
    ?>

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

Cảm ơn, Điều này hoạt động tốt với tôi vì tôi muốn tất cả các tên miền, http và https và bất kỳ loại tào lao nào khác trong url.
MakuraYami

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

Điều này nên làm điều đó là tốt.


4

Tôi đã có một số nội dung bài đăng mà tôi phải mật mã trong suốt để lấy ID Youtube ra. Nó tình cờ ở dạng <iframe>mã nhúng mà Youtube cung cấp.

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

Mẫu sau tôi nhận được từ @rob ở trên. Đoạn mã thực hiện một foreachvòng lặp một khi các trận đấu được tìm thấy và để có thêm phần thưởng, tôi đã liên kết nó với hình ảnh xem trước được tìm thấy trên Youtube. Nó có khả năng phù hợp với nhiều loại kiểu nhúng và url của Youtube hơn:

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

Hồ sơ của Rob: https://stackoverflow.com/users/149615/rob


4

Để trích xuất idtrong một nhóm bắt giữ, biểu thức sau hoặc một số dẫn xuất của điều đó cũng có thể là một tùy chọn:

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

Bản giới thiệu

Kiểm tra

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

Đầu ra

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

Nếu bạn muốn đơn giản hóa / sửa đổi / khám phá biểu thức, nó sẽ được giải thích trên bảng trên cùng bên phải của regex101.com . Nếu bạn muốn, bạn cũng có thể xem trong liên kết này , cách nó phù hợp với một số đầu vào mẫu.


Mạch RegEx

jex.im hình dung các biểu thức thông thường:

nhập mô tả hình ảnh ở đây



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

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

2

Tôi biết rằng tiêu đề của chủ đề đề cập đến việc sử dụng regex, nhưng giống như trích dẫn của Zawinski, tôi thực sự nghĩ rằng tránh regexes là tốt nhất ở đây. Tôi muốn giới thiệu chức năng này thay thế:

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

}

Tôi khuyên bạn nên làm điều này vì ID của video YouTube luôn giống nhau, độc lập với kiểu URL, vd

  • http://www.youtube.com/watch?v=t_uW44Bsezg
  • http://www.youtube.com/watch?feature=endscreen&v=Id3xG4xnOfA&NR=1
  • `Và hình thức Ulr khác trong đó từ" nhúng / "được đặt trước Id ... !!

và đó có thể là trường hợp cho các iframecông cụ nhúng và -ed.


0

Chỉ cần tìm thấy trực tuyến này tại 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;
}

0

Tôi đã sử dụng dữ liệu từ câu trả lời của Shawn nhưng khái quát hóa và rút ngắn regex một chút. Sự khác biệt chính với cái này là nó sẽ không kiểm tra URL Youtube hợp lệ, nó sẽ chỉ tìm ID video. Có nghĩa là nó vẫn sẽ trả về một ID video cho www.facebook.com?wtv=youtube.com/v/vidid. Hoạt động cho tất cả các trường hợp thử nghiệm, nhưng lỏng lẻo hơn một chút. Do đó, nó sẽ tạo ra một dương tính giả cho một cái gì đó như https://www.twitter.com/watch?v=vidid. Sử dụng phương pháp này nếu dữ liệu siêu không nhất quán, nếu không thì sử dụng regex cụ thể hơn hoặc parse_url()parse_str().

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

0

Tôi nghĩ rằng bạn đang cố gắng để làm điều này.

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

và nếu tôi muốn trích xuất một url youtue từ một chuỗi đầy các ký tự khác thì sao? như thế này:

Lorem ipsum dolor ngồi amet, consectetur adipiscing elit, sed do eiusmod TIME incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud tập thể dục ullamco https://www.youtube.com/watch?v=cPW9Y94BJI0 labis nisi ut aliquip ex ea Vendo result. Duis aute irure dolor in repimpenderit in voluptate esse cillum dolore eu fugiat nulla pariatur. Ngoại trừ sint thỉnh thoảng cupidatat không phải là người bình thường, sunt in culpa qui docia deserunt mollit anim id est labum.

và nhận https://www.youtube.com/watch?v=cPW9Y94BJI0 từ chuỗi đó?


0

Sử dụng mã này:

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

kết quả : C4kxS1ksqtw

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.