PHP Regex เพื่อรับรหัสวิดีโอ youtube หรือไม่


137

มีคนแสดงให้ฉันดูว่าจะดึง youtube ออกจาก url ได้อย่างไรโดยไม่คำนึงถึงตัวแปร GET อื่น ๆ ที่อยู่ใน URL

ใช้วิดีโอนี้เป็นตัวอย่าง: http://www.youtube.com/watch?v=C4kxS1ksqtw&feature=related
ดังนั้นระหว่างv=และก่อนหน้า&


1
นั่นอาจเป็นประโยชน์ stackoverflow.com/questions/9522868/…

1
คุณควรดูรหัสของฉันgithub.com/lingtalfi/video-ids-and-thumbnails/blob/master/…ฉันให้ฟังก์ชั่นที่ดึง id จาก youtube, vimeo และ dailymotion
ling

@ling in function getVideoThumbnailByUrl () คุณใช้ file_get_contents () ที่คัดค้านสำหรับ Vimeo การแทนที่นี้จะทำงานได้ทุกที่:$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 ด้วยใน getYoutubeId ($ url) เงื่อนไขสุดท้ายจะยอมรับสตริงใด ๆ และตรวจสอบว่าเป็นรหัส YT ฉันผ่านมัน 'ขยะ' และมันคืนขยะเป็นรหัสแยกวิเคราะห์จากสตริงที่
jerrygarciuh

@jerrygarciuh: afaik file_get_contents ไม่ได้รับการสนับสนุนโปรดรายงานปัญหาเกี่ยวกับ GitHub หากคุณมีปัญหากับฟังก์ชั่นนี้ ขอขอบคุณที่พบข้อผิดพลาดใน getYoutubeId (ฉันปรับปรุงแล้ว)
ling

คำตอบ:


304

ใช้ parse_url ()และparse_str ()()

(คุณสามารถใช้ regexes เพื่ออะไรก็ได้ แต่มันง่ายมากที่จะทำให้เกิดข้อผิดพลาดดังนั้นถ้ามีฟังก์ชั่น PHP เฉพาะสำหรับสิ่งที่คุณพยายามจะทำให้ใช้มัน)

parse_url รับสตริงและตัดเป็นอาร์เรย์ที่มีข้อมูลจำนวนมาก คุณสามารถทำงานกับอาร์เรย์นี้หรือคุณสามารถระบุรายการที่คุณต้องการเป็นอาร์กิวเมนต์ที่สอง ในกรณีนี้เราสนใจคำถามซึ่งก็คือPHP_URL_QUERYในกรณีนี้เรากำลังสนใจในแบบสอบถามซึ่งเป็น

ตอนนี้เรามีแบบสอบถามซึ่งเป็นแต่เราต้องการเพียงส่วนหนึ่งหลังจากที่v=C4kxS1ksqtw&feature=relate v=สำหรับสิ่งนี้เราจะหันไปหาparse_strสิ่งที่ใช้งานได้ดีGETบนสายอักขระ มันต้องใช้สตริงและสร้างตัวแปรที่ระบุในสตริง ในกรณีนี้$vและ$featureถูกสร้างขึ้น เราสนใจเท่านั้น$vเรากำลังสนใจเฉพาะใน

เพื่อความปลอดภัยคุณไม่ต้องการเพียงแค่เก็บตัวแปรทั้งหมดจาก parse_urlในเนมสเปซของคุณ (ดูความคิดเห็น mellowsoon) แทนที่จะเก็บตัวแปรไว้เป็นองค์ประกอบของอาเรย์เพื่อให้คุณสามารถควบคุมตัวแปรที่คุณกำลังเก็บและคุณไม่สามารถเขียนทับตัวแปรที่มีอยู่โดยไม่ตั้งใจได้

การรวมทุกอย่างเข้าด้วยกันเรามี:

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

ตัวอย่างการทำงาน


แก้ไข:

ฮิฮิ - ขอบคุณชาร์ลส์ นั่นทำให้ฉันหัวเราะฉันไม่เคยเห็นคำพูดของ Zawinski มาก่อน:

Some people, when confronted with a problem, think ‘I know, I’ll use regular expressions.’ Now they have two problems. - เจมี่ซาวินสกี


1
แม้ว่ามันจะไม่ใช้ regex (อย่างน้อยก็เห็นได้ชัด - ฉันไม่แน่ใจว่าparse_url()ทำงานได้อย่างไรภายใต้ประทุน) นี่คือวิธีที่จะไป
Thomas Owens

11
<ใส่ Zawinski อ้างอิงที่นี่> แม้ว่าในทุกกรณีที่จริงจังการใช้ฟังก์ชั่นภาษาในการปฏิบัติงานมักจะดีกว่าการกระโดดแบบวนซ้ำซึ่งต้องใช้ regex ที่ดี
ชาร์ลส์

1
ฉันขอแนะนำให้ใช้พารามิเตอร์ที่สองของ parse_str () เพื่อเก็บ params แบบสอบถามไว้ในอาร์เรย์ การมีตัวแปรปรากฏอย่างน่าอัศจรรย์จากอากาศที่บางเบานั้นไม่ใช่ความคิดที่ดีเลย
mellowsoon

2
ตัวอย่างง่ายๆอย่างรวดเร็วว่าทำไมการใช้ "ตัวแปรเวทมนต์" ของ parse_str ไม่ใช่ความคิดที่ดี -> pastebin.com/AtaaPH4r
mellowsoon

1
@ Qualitycuno - ไม่แน่นอน นี่คือการดึง "รับตัวแปร" โดยเฉพาะ - ต่อ OP ตัวอย่างของคุณไม่ได้รับตัวแปร
Peter Ajtai

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

นี้จะบัญชีสำหรับ

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}

ฉันปรับปรุงเล็กน้อยเพื่อรองรับ: http://www.youtube.com/v/5xADESocujo?feature=autoshare&version=3&autohide=1&autoplay=1

บรรทัดที่ฉันใช้ตอนนี้คือ:

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

3
ฉันได้อัปเดตเพื่อจัดการ URL เช่นนี้: youtube.com/embed/7zuAOomfiCc #(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+(?=\?)|(?<=embed/)[^&\n]+|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#
simonbs

11
ใช้งานได้กับ URL ทั้งหมดรวมถึงสตริงฝัง(?<=(?:v|i)=)[a-zA-Z0-9-]+(?=&)|(?<=(?:v|i)\/)[^&\n]+|(?<=embed\/)[^"&\n]+|(?<=(?:v|i)=)[^&\n]+|(?<=youtu.be\/)[^&\n]+ rubular.com/r/M9PJYcQxRW
Rob

3
วิธีการเกี่ยวกับเรื่องนี้ >] +) /
bokor

2
ที่จริงแล้ว @ รหัสของ bokor จะเติมข้อมูลให้$matchesอาร์เรย์พร้อมข้อมูลเพิ่มเติมรวมถึงรหัสวิดีโอซึ่งมีประโยชน์มากสำหรับโครงการของฉัน
cronoklee

2
นอกจากนี้ใน regex ของ Rob และรายการก็ถูกจับเช่นกัน นี่คือสิ่งที่แยกออกมาใน regex ด้านล่าง: # (? <= (?: v | i) =) [a-zA-Z0-9 -_] + | (? <= (?: v | i) \ /) [^ & \ n?] + | [^ "และ \ n?] + (<= ฝัง \ /?) | (<= (:? วี | i) =) [? ^ & \ n] + | (? <= youtu.be \ /) [^ &? \ n] + # ได้รับการสนับสนุนแล้ว: youtu.be/RRyG_mtYieI?list=PLnBXpb1YLPttKF7RZX64qI_AEyFjTvgtx youtube.com/…… _AEyFjTvt.com/ RRyG_mtYieI? list = PLnBXpb1YLPttKF7RZX64qI_AEyFjTvgtx youtube.com/v/RRyG_mtYieI
ริคเดอเกรฟ

101

ตามความคิดเห็นของ bokor ตามคำตอบของ Anthony:

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

$matches[1] มี vidid

ตรงกัน:

ไม่ตรงกับ:

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

คุณมีสตริงนี้ในเวอร์ชัน C / objc / c ++ หรือไม่ ฉันไม่รู้ว่าจะหนีส่วนไหน
João Nunes

ฉันลอง: "^ (?: http (?: s)?: //)? (?: www \\.)? (?: youtu \\. be / | youtube \\. com / (? :(? : นาฬิกา) \ (* &) โวลต์ (i) = | (:?.? ฝัง | v | vi | ผู้ใช้) /)) ([? ^ \ & \ " '>] +) "ไม่ผ่านตัวอย่างทั้งหมดของคุณ
João Nunes

1
ฉันพบปัญหาของฉัน นี่คือสตริง c สุดท้าย: "^ (?: http (?: s)?: //)? (?: www \\.)? (?: youtu \\. be / | youtube \\. com / \\ (* &.) V = (:( ?: นาฬิกา?)? (i?)? | (: ฝัง | v | vi | ผู้ใช้) /)) ([^ \ & \? "'>] +)"
João Nunes

หากต้องการคำนึงถึง URL เช่นyoutube.com/watch?v=vidid#action=shareฉันได้เพิ่ม#กลุ่มจับภาพตอนจบ:preg_match("/^(?:http(?:s)?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user)\/))([^\?#&\"'>]+)/", $url, $matches);
joshangell

1
มันเพิ่มเนื้อหาที่มีช่องว่างและคว้าข้อความทั้งหมดหลังจาก url บนหน้า นี่จะดีกว่า / (?: http (?: s)?: \ / \ /)? (?: www \.)? (?: m \.)? (?: youtu \ .be \ / | youtube \ คอม \ / \: V = (:( ?: นาฬิกา?)? (* &.) (i?)? | (: ฝัง | v | vi | ผู้ใช้) \ /)) ([A- zA-Z0-9 \ -_] *) /
Gino

36

สิ่งนี้สามารถทำได้อย่างง่ายดายโดยใช้parse_strและparse_urlและเชื่อถือได้มากกว่าในความคิดของฉัน

ฟังก์ชั่นของฉันรองรับ URL ต่อไปนี้:

รวมถึงการทดสอบด้านล่างฟังก์ชั่น

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

นี่เป็นเรื่องที่ยอดเยี่ยมมากและใช้งานได้จริงกับวิดีโอ vimeo เช่นกัน
Chris James Champeau

1
นี่เป็นคำตอบที่ฉันต้องการ ครอบคลุมทั้ง YouTube และ Vimeo หนึ่งบันทึกย่อฉันเพิ่ม tweak ที่เล็กมาก ๆ ด้วย isset เพิ่มเติม () - ถ้า if (isset ($ qs ['vi'])) ขอบคุณมากสำหรับสิ่งนี้
spedley

23

SOLTUION สำหรับลิงค์ประเภทใด ๆ !! :

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

เอาท์พุท: GvJehZx3eQ1


13

แก้ไขตามวิธีการตรวจสอบรหัสวิดีโอของ 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

เราทราบ ID วิดีโอที่มีความยาว 11 ตัวอักษรและสามารถนำหน้าด้วยv=หรือvi=หรือv/หรือหรือvi/ youtu.be/ดังนั้นวิธีที่ง่ายที่สุดในการทำเช่นนี้:

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

และเอาท์พุท:

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

ต่อไปนี้จะใช้ได้กับลิงก์ 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];

ขอบคุณสิ่งนี้ใช้ได้ดีสำหรับฉันเนื่องจากฉันต้องการโดเมนทั้งหมด http และ https และอึอื่น ๆ ใน url
MakuraYami


4

ฉันมีเนื้อหาโพสต์ที่ฉันต้องเข้ารหัสตลอดเพื่อรับ Youtube ID จาก มันเกิดขึ้นในรูปแบบของ<iframe>รหัสที่ Youtube ฝังไว้

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

รูปแบบต่อไปนี้ฉันได้รับจาก @rob ด้านบน ตัวอย่างจะforeachวนซ้ำเมื่อพบการแข่งขันและสำหรับโบนัสเพิ่มฉันเชื่อมโยงไปยังภาพตัวอย่างที่พบใน Youtube สามารถจับคู่ประเภทและ 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;
}

โปรไฟล์ของ Rob: https://stackoverflow.com/users/149615/rob


4

สำหรับการแยกidกลุ่มการจับภาพนิพจน์ต่อไปนี้หรืออนุพันธ์ของบางอย่างนั้นอาจเป็นตัวเลือกด้วย:

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

การสาธิต

ทดสอบ

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

เอาท์พุต

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

หากคุณต้องการที่จะลดความซับซ้อน / การแก้ไข / การสำรวจการแสดงออกก็ถูกอธิบายอยู่ด้านบนขวาของแผงregex101.com หากคุณต้องการคุณยังสามารถดูในลิงค์นี้ว่ามันจะตรงกับอินพุตตัวอย่างบางส่วนได้อย่างไร


วงจร RegEx

jex.imเห็นภาพการแสดงออกปกติ:

ป้อนคำอธิบายรูปภาพที่นี่




2

ฉันรู้ว่าชื่อของเธรดหมายถึงการใช้ regex แต่ตามที่คำพูดของ Zawinski กล่าวไว้ฉันคิดว่าการหลีกเลี่ยงการใช้ regex นั้นดีที่สุด ฉันขอแนะนำฟังก์ชั่นนี้แทน:

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

}

ฉันแนะนำสิ่งนี้เพราะ ID ของวิดีโอ YouTube จะเหมือนกันเสมอโดยไม่ขึ้นกับรูปแบบของ URL เช่น

  • http://www.youtube.com/watch?v=t_uW44Bsezg
  • http://www.youtube.com/watch?feature=endscreen&v=Id3xG4xnOfA&NR=1
  • `และรูปแบบ Ulr อื่น ๆ ที่คำว่า" ฝัง / "วางไว้ก่อนรหัส ... !!

และอาจเป็นกรณีสำหรับสิ่งที่ฝังตัวและiframe-ed


0

เพิ่งพบออนไลน์นี้ที่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

ฉันใช้ข้อมูลจากคำตอบของ Shawnแต่เป็นการสรุปและทำให้ regex สั้นลงเล็กน้อย ความแตกต่างที่สำคัญกับอันนี้คือมันจะไม่ทดสอบ URL ของ YouTube ที่ถูกต้อง แต่มันจะมองหารหัสวิดีโอ www.facebook.com?wtv=youtube.com/v/vididความหมายมันจะยังคงกลับรหัสวิดีโอสำหรับ ใช้งานได้กับทุกกรณีทดสอบ แต่ค่อนข้างหละหลวม https://www.twitter.com/watch?v=vididดังนั้นมันจะได้ผลลัพธ์ที่เป็นบวกเท็จบางอย่างเช่น ใช้วิธีนี้ถ้าข้อมูลไม่สอดคล้องซุปเปอร์มิฉะนั้นใช้ regex เฉพาะเจาะจงมากขึ้นหรือและparse_url()parse_str()

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

0

ฉันคิดว่าคุณกำลังพยายามทำสิ่งนี้

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

แล้วถ้าฉันต้องการดึง url youtue จากสตริงที่เต็มไปด้วยตัวละครอื่นล่ะ แบบนี้:

Lorem ipsum dolor amet amet, consetetur adipiscing elit, sed do eiusmod tempic incididunt ut labore et dolore magna aliqua. จากนั้นจึงไปที่นั่น, จากการออกกำลังกายของคุณที่https://www.youtube.com/watch?v=cPW9Y94BJI0แรงงานจะได้รับผลกระทบจากสินค้าโภคภัณฑ์ ต้องมีสีที่บริสุทธิ์ใน reprehenderit ใน voluptate velit esse cillum dolore eu fugiat nulla pariatur ยกเว้นบางครั้งเกิดเหตุการณ์ที่ไม่เป็นไปได้, ในขณะที่ culpa ที่มีคุณภาพที่ดีที่สุดที่จะทำให้คุณเคลื่อนไหว

และรับhttps://www.youtube.com/watch?v=cPW9Y94BJI0จากสตริงนั้น


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.