ฉันจะรับรหัสวิดีโอ YouTube จาก URL ได้อย่างไร


257

ฉันต้องการที่จะได้รับ v=id URL จาก YouTube ด้วย JavaScript (ไม่ใช่ jQuery, JavaScript บริสุทธิ์)

ตัวอย่างรูปแบบ URL ของ YouTube

http://www.youtube.com/watch?v=u8nQa1cJyX8&a=GxdCwVVULXctT2lYDEPllDR0LRTutYfW

http://www.youtube.com/watch?v=u8nQa1cJyX8

หรือรูปแบบ YouTube อื่น ๆ ที่มีรหัสวิดีโอใน URL

ผลลัพธ์จากรูปแบบเหล่านี้

u8nQa1cJyX8



คำถามนั้นสำหรับรูปแบบเช่นเดียวกับที่สองของฉัน แต่ฉันพบคำตอบที่น่าสนใจที่นั่นขอบคุณที่แบ่งปัน
อดัม

มีการแสดงออกปกติสำหรับที่: http://pregcopy.com/exp/27
Exos

ไม่สามารถใช้บัตรเครดิตใด ๆ สำหรับมัน แต่ฉันพบนี้จะกว้างขวางสวย: gist.github.com/FinalAngel/1876898 มันจับ URL ที่หลากหลายเช่นyoutube.com/watch?feature=player_embedded&v=1p3vcRhsYGoและyoutube.com/v/1p3vcRhsYGo
Simon

2
ตั้งแต่ปี 2015:ข้ามไปที่คำตอบนี้ คำตอบอื่น ๆ ล้าสมัย
Lenar Hoyt

คำตอบ:


109

คุณไม่จำเป็นต้องใช้นิพจน์ทั่วไปสำหรับสิ่งนี้

var video_id = window.location.search.split('v=')[1];
var ampersandPosition = video_id.indexOf('&');
if(ampersandPosition != -1) {
  video_id = video_id.substring(0, ampersandPosition);
}

นี่คือฟังก์ชั่นที่มีประโยชน์เพื่อให้มันทำงานได้ตามที่คุณต้องการตามรหัสนี้ var video_url = ' youtube.com/watch?v=eOrNdBpGMv8&feature=youtube_gdata '; ytid (video_url); ฟังก์ชัน ytid (video_url) {var video_id = video_url.split ('v =') [1]; var ampersandPosition = video_id.indexOf ('&'); if (ampersandPosition! = -1) {video_id = video_id.substring (0, ampersandPosition); } การแจ้งเตือน (video_id); ส่งคืน video_id; }
จีโน่

9
ไม่จัดการ URL ที่ฝังตัว
Serge

14
ยังไม่ได้จัดการ URL แชร์ที่สร้างขึ้นhttps://youtu.be/{{video_id}}
hamncheez

2
regex นี้ทำงานได้ดีกับ youtube share และดู url url='https://youtu.be/{{video_id}}'; url.match(/(?:https?:\/{2})?(?:w{3}\.)?youtu(?:be)?\.(?:com|be)(?:\/watch\?v=|\/)([^\s&]+)/);
Dipten

410

ฉันได้ทำการเพิ่มประสิทธิภาพให้กับ Regex ที่จัดทำโดย "jeffreypriebe" เพราะเขาต้องการ URL ของ YouTube เป็น URL ของวิดีโอเมื่อพวกเขาดูช่อง

ไม่ใช่ แต่นี่เป็นฟังก์ชั่นที่ฉันติดอาวุธ

<script type="text/javascript">
function youtube_parser(url){
    var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#&?]*).*/;
    var match = url.match(regExp);
    return (match&&match[7].length==11)? match[7] : false;
}
</script>

นี่คือประเภทของ URL ที่รองรับ

http://www.youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index
http://www.youtube.com/user/IngridMichaelsonVEVO#p/a/u/1/QdK8U-VIH_o
http://www.youtube.com/v/0zM3nApSvMg?fs=1&amp;hl=en_US&amp;rel=0
http://www.youtube.com/watch?v=0zM3nApSvMg#t=0m10s
http://www.youtube.com/embed/0zM3nApSvMg?rel=0
http://www.youtube.com/watch?v=0zM3nApSvMg
http://youtu.be/0zM3nApSvMg

สามารถพบได้ใน[http://web.archive.org/web/20160926134334/] http://lasnv.net/foro/839/Javascript_parsear_URL_de_YouTube


6
regex มีข้อผิดพลาดเล็กน้อย \ ?? v? =? นี่ควรอยู่ที่ส่วนนาฬิกามิฉะนั้นคุณจะกรอง 'v' หากรหัสเริ่มต้นด้วย 'v' ดังนั้นสิ่งนี้ควรทำเคล็ดลับ /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\??v? =?)) ([^ # \ & \?] *). * /
webstrap

69
แม้จะสะอาดกว่า: /.*(?:youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=)([^#\&\?]*).*/ จากนั้นใช้match[1]แทนmatch[7](ซึ่งดูเหมือนว่าฉันจะเป็นเรื่องเล็กน้อย) แก้ไขข้อผิดพลาดที่ชี้โดย WebDev ด้วย
Chris Nolet

3
นานแค่ไหนจนกระทั่งรหัส YouTube มีความยาว 12 ตัวอักษร
Lenar Hoyt

1
คุณรู้ไหมว่ามันไม่สมบูรณ์แบบถ้าคุณใส่อะไร.
jn40gqhxoSY

1
ทุกคนสามารถขยายความต้องการนี้และทำให้คนบ่นไม่ได้มีเหตุผลใด ๆ
Lecha Bisultanov

241

ฉันทำให้คำตอบของ Lasnv ง่ายขึ้นเล็กน้อย

นอกจากนี้ยังแก้ไขข้อผิดพลาดที่ WebDeb อธิบาย

นี่มันคือ:

var regExp = /^.*(youtu\.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/;
var match = url.match(regExp);
if (match && match[2].length == 11) {
  return match[2];
} else {
  //error
}

นี่คือลิงค์ regexer เพื่อเล่นกับ: http://regexr.com/3dnqv


2
แค่หัวขึ้น: สิ่งนี้ควรใช้เมื่อคุณรู้ว่าคุณกำลังจัดการกับ URL ของ YouTube เท่านั้น ฉัน (ใช้ผิด) ใช้เพื่อยืนยัน URL เป็น youtube ซึ่งทำให้เกิดผลบวกปลอมเช่นรหัสผ่านนี้: 'v / 2059-9080-5437'
fabi

3
ตอนนี้ฉันใช้ Regex อื่นที่ตรวจสอบโดเมนของ YouTube ด้วย ฉันไม่แน่ใจว่าควรอัปเดตคำตอบเพราะเป็นการเปลี่ยนแปลงครั้งใหญ่หรือไม่ \ / | ฝัง \ / |. * v =)) ([\ w -] {11}). * /
mantish

4
YouTube จะเปลี่ยนเป็น ID วิดีโอ 12 ตัวเมื่อใด
Lenar Hoyt

ไม่ควรจุดใน "youtu.be" ถูกหลบหนี
อเล็กซ์

คุณถูก @jitbit ขอบคุณ แม้ว่ามันจะใช้งานได้ตามปกติโดยไม่ต้องหลบหนี
mantish

85

สิ่งเหล่านี้ไม่ได้ทำงานบนอ่างล้างจานในครัวในวันที่ 1/1/2558 โดยเฉพาะอย่างยิ่ง URL ที่ไม่มี protocal http / s และโดเมน youtube-nocookie ดังนั้นนี่คือรุ่นที่ปรับเปลี่ยนซึ่งใช้งานได้กับ Youtube รุ่นต่างๆเหล่านี้:

// Just the regex. Output is in [1].
/^.*(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/)|(?:(?:watch)?\?v(?:i)?=|\&v(?:i)?=))([^#\&\?]*).*/

// For testing.
var urls = [
    '//www.youtube-nocookie.com/embed/up_lNV-yoK4?rel=0',
    'http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo',
    'http://www.youtube.com/watch?v=cKZDdG9FTKY&feature=channel',
    'http://www.youtube.com/watch?v=yZ-K7nCVnBI&playnext_from=TL&videos=osPknwzXEas&feature=sub',
    'http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I',
    'http://www.youtube.com/user/SilkRoadTheatre#p/a/u/2/6dwqZw0j_jY',
    'http://youtu.be/6dwqZw0j_jY',
    'http://www.youtube.com/watch?v=6dwqZw0j_jY&feature=youtu.be',
    'http://youtu.be/afa-5HQHiAs',
    'http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo?rel=0',
    'http://www.youtube.com/watch?v=cKZDdG9FTKY&feature=channel',
    'http://www.youtube.com/watch?v=yZ-K7nCVnBI&playnext_from=TL&videos=osPknwzXEas&feature=sub',
    'http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I',
    'http://www.youtube.com/embed/nas1rJpm7wY?rel=0',
    'http://www.youtube.com/watch?v=peFZbP64dsU',
    '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'
];

var i, r, rx = /^.*(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/)|(?:(?:watch)?\?v(?:i)?=|\&v(?:i)?=))([^#\&\?]*).*/;

for (i = 0; i < urls.length; ++i) {
    r = urls[i].match(rx);
    console.log(r[1]);
}

2
น่าสังเกตว่าโซลูชันข้างต้นจำนวนมากไม่ครอบคลุม URL ที่ถูกต้องจำนวนมากสคริปต์ทดสอบมีประโยชน์มาก +1!
blended

2
โปรดทราบว่าสิ่งนี้จะถูกหลอกโดยบางอย่างเช่น "www.engadget.com/watch?v=dQw4w9WgXcQ" ไม่ใช่ว่ามันน่าจะเป็นปัญหา แต่
binaryfunt

ใช้งานได้ แต่ไม่สามารถแก้ไขปัญหาที่เกิดขึ้นกับข้อความที่มี URL ของ YouTube หลายรายการดูregex101.com/r/qK5qJ5/1นี้ ไม่ควรแทนที่ URL ที่สอง
Ashish

2
หากคุณไม่ต้องการให้ ID ตรงกับที่ว่างเปล่า : ^.*(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/)|(?:(?:watch)?\?v(?:i)?=|\&v(?:i)?=))([^#\&\?]+).*(เช่นyoutube.com/watch?v=จะไม่ตรงกัน)
zurfyx

คุณหมายถึงอะไร "ไม่มีสิ่งเหล่านี้ทำงานบนอ่างครัว"?
rmutalik

26
/^.*(youtu.be\/|v\/|e\/|u\/\w+\/|embed\/|v=)([^#\&\?]*).*/

ทดสอบเมื่อ:

  • http://www.youtube.com/v/0zM3nApSvMg?fs=1&hl=en_US&rel=0
  • http://www.youtube.com/embed/0zM3nApSvMg?rel=0
  • http://www.youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index
  • http://www.youtube.com/watch?v=0zM3nApSvMg
  • http://youtu.be/0zM3nApSvMg
  • http://www.youtube.com/watch?v=0zM3nApSvMg#t=0m10s
  • http://www.youtube.com/user/IngridMichaelsonVEVO#p/a/u/1/KdwsulMb8EQ
  • http://youtu.be/dQw4w9WgXcQ
  • http://www.youtube.com/embed/dQw4w9WgXcQ
  • http://www.youtube.com/v/dQw4w9WgXcQ
  • http://www.youtube.com/e/dQw4w9WgXcQ
  • http://www.youtube.com/watch?v=dQw4w9WgXcQ
  • http://www.youtube.com/?v=dQw4w9WgXcQ
  • http://www.youtube.com/watch?feature=player_embedded&v=dQw4w9WgXcQ
  • http://www.youtube.com/?feature=player_embedded&v=dQw4w9WgXcQ
  • http://www.youtube.com/user/IngridMichaelsonVEVO#p/u/11/KdwsulMb8EQ
  • http://www.youtube-nocookie.com/v/6L3ZvIMwZFM?version=3&hl=en_US&rel=0

แรงบันดาลใจจากคำตอบอื่น ๆนี้


9
^. * (?: youtu.be \ / | v \ / | e \ / | u \ / \ w + \ / | ฝัง \ / | v =) ([^ # \ & \?] *). จะให้ ผลลัพธ์ในกลุ่มที่ 1
Marc

20

เนื่องจาก YouTube มีสไตล์ URL ที่หลากหลายฉันคิดว่า Regex เป็นโซลูชันที่ดีกว่า นี่คือ Regex ของฉัน:

^.*(youtu.be\/|v\/|embed\/|watch\?|youtube.com\/user\/[^#]*#([^\/]*?\/)*)\??v?=?([^#\&\?]*).*

กลุ่ม 3 มีรหัส YouTube ของคุณ

ตัวอย่าง URL ของ YouTube (ปัจจุบันรวมถึง "รูปแบบ URL ฝังแบบดั้งเดิม") Regex ด้านบนใช้งานได้กับทุกอย่าง:

http://www.youtube.com/v/0zM3nApSvMg?fs=1&amp;hl=en_US&amp;rel=0
http://www.youtube.com/embed/0zM3nApSvMg?rel=0
http://www.youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index
http://www.youtube.com/watch?v=0zM3nApSvMg
http://youtu.be/0zM3nApSvMg
http://www.youtube.com/watch?v=0zM3nApSvMg#t=0m10s
http://www.youtube.com/user/IngridMichaelsonVEVO#p/a/u/1/QdK8U-VIH_o

ปลายหมวกไปยัง Lasnv


9
คุณต้องกลับไปที่กระดานวาดภาพกับอันนี้จริงๆ ใช่มันตรงกับ URL ด้านบนอย่างถูกต้อง แต่มันก็ยังไม่สมควรจะตรงกับหลายสายที่ไม่ใช่ YouTube-URL อื่นเช่น"domain.com/embed/file.txt", และ"/tv/" "Has anyone seen my watch?"ดู: คำตอบของฉันสำหรับคำถามที่คล้ายกันเพื่อหาคำตอบที่แม่นยำยิ่งขึ้น
ridgerunner

1
ฉันเห็นประเด็นของคุณแล้ว Regex ด้านบนไม่มีประโยชน์ที่จะตอบคำถามของ "นี่คือ URL ของ YouTube หรือไม่" แต่นั่นไม่ใช่เป้าหมายของฉัน ฉันมี URL ของ YouTube - ฉันแค่ดึงรหัส ใช่คำตอบของคุณมั่นคง (และครอบคลุมกรณีการใช้งานที่ฉันไม่ได้ทำ)
jeffreypriebe

คุณมีข้อผิดพลาดเดียวกันฉันกล่าวข้างต้นด้วยรหัสเริ่มต้นด้วย 'v'
webstrap

ขอบคุณ @WebDev - คุณรู้หรือไม่ว่า YouTube ใส่ av ใน ID (หรือเริ่ม ID ด้วย "v")?
jeffreypriebe

1
ยังคงใช้งานได้ในวันนี้ (2013-01-25) นี่คือตัวอย่างของการใช้งานจริง: jsfiddle.net/bcmoney/yBP4J
bcmoney

17

ฉันสร้างฟังก์ชั่นที่ทดสอบการป้อนข้อมูลผู้ใช้สำหรับ Youtube, Soundcloud หรือ Vimeo ฝังรหัสเพื่อให้สามารถสร้างการออกแบบที่ต่อเนื่องมากขึ้นด้วยสื่อฝังตัว ฟังก์ชั่นนี้ตรวจจับและส่งคืนวัตถุที่มีคุณสมบัติสองอย่าง: "type" และ "id" ประเภทสามารถเป็นได้ทั้ง "youtube", "vimeo" หรือ "soundcloud" และคุณสมบัติ "id" เป็นรหัสสื่อที่ไม่ซ้ำกัน

ในเว็บไซต์ฉันใช้เท็กซ์area dump ซึ่งผู้ใช้สามารถวางในลิงค์ประเภทใดก็ได้หรือโค้ดฝังรวมถึง iFrame-embedding ของ vimeo และ youtube

function testUrlForMedia(pastedData) {
var success = false;
var media   = {};
if (pastedData.match('http://(www.)?youtube|youtu\.be')) {
    if (pastedData.match('embed')) { youtube_id = pastedData.split(/embed\//)[1].split('"')[0]; }
    else { youtube_id = pastedData.split(/v\/|v=|youtu\.be\//)[1].split(/[?&]/)[0]; }
    media.type  = "youtube";
    media.id    = youtube_id;
    success = true;
}
else if (pastedData.match('http://(player.)?vimeo\.com')) {
    vimeo_id = pastedData.split(/video\/|http:\/\/vimeo\.com\//)[1].split(/[?&]/)[0];
    media.type  = "vimeo";
    media.id    = vimeo_id;
    success = true;
}
else if (pastedData.match('http://player\.soundcloud\.com')) {
    soundcloud_url = unescape(pastedData.split(/value="/)[1].split(/["]/)[0]);
    soundcloud_id = soundcloud_url.split(/tracks\//)[1].split(/[&"]/)[0];
    media.type  = "soundcloud";
    media.id    = soundcloud_id;
    success = true;
}
if (success) { return media; }
else { alert("No valid media id detected"); }
return false;
}

เป็นแนวคิดที่ดี แต่ไม่ได้ผลกับรูปแบบ URL ส่วนใหญ่ การรวมไม่ตรงกับเว็บไซต์ https ใด ๆ
NickG

13

มาช้าไปที่เกม แต่ฉันได้ทำการตอบสนองที่ยอดเยี่ยมสองอย่างจาก mantish และ jw ครั้งแรกที่ regex แก้ไข:

const youtube_regex = /^.*(youtu\.be\/|vi?\/|u\/\w\/|embed\/|\?vi?=|\&vi?=)([^#\&\?]*).*/

นี่คือรหัสการทดสอบ (ฉันได้เพิ่มกรณีทดสอบดั้งเดิมของ mantish ให้กับคนแปลกหน้าของ jw):

 var urls = [
      'http://www.youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index',
      'http://www.youtube.com/user/IngridMichaelsonVEVO#p/a/u/1/QdK8U-VIH_o',
      'http://www.youtube.com/v/0zM3nApSvMg?fs=1&amp;hl=en_US&amp;rel=0',
      'http://www.youtube.com/watch?v=0zM3nApSvMg#t=0m10s',
      'http://www.youtube.com/embed/0zM3nApSvMg?rel=0',
      'http://www.youtube.com/watch?v=0zM3nApSvMg',
      'http://youtu.be/0zM3nApSvMg',
      '//www.youtube-nocookie.com/embed/up_lNV-yoK4?rel=0',
      'http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo',
      'http://www.youtube.com/watch?v=cKZDdG9FTKY&feature=channel',
      'http://www.youtube.com/watch?v=yZ-K7nCVnBI&playnext_from=TL&videos=osPknwzXEas&feature=sub',
      'http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I',
      'http://www.youtube.com/user/SilkRoadTheatre#p/a/u/2/6dwqZw0j_jY',
      'http://youtu.be/6dwqZw0j_jY',
      'http://www.youtube.com/watch?v=6dwqZw0j_jY&feature=youtu.be',
      'http://youtu.be/afa-5HQHiAs',
      'http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo?rel=0',
      'http://www.youtube.com/watch?v=cKZDdG9FTKY&feature=channel',
      'http://www.youtube.com/watch?v=yZ-K7nCVnBI&playnext_from=TL&videos=osPknwzXEas&feature=sub',
      'http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I',
      'http://www.youtube.com/embed/nas1rJpm7wY?rel=0',
      'http://www.youtube.com/watch?v=peFZbP64dsU',
      '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'
  ];

  var failures = 0;
  urls.forEach(url => {
    const parsed = url.match(youtube_regex);
    if (parsed && parsed[2]) {
      console.log(parsed[2]);
    } else {
      failures++;
      console.error(url, parsed);
    }
  });
  if (failures) {
    console.error(failures, 'failed');
  }

รุ่นทดลองเพื่อจัดการURL m.youtube ที่กล่าวถึงในความคิดเห็น:

const youtube_regex = /^.*((m\.)?youtu\.be\/|vi?\/|u\/\w\/|embed\/|\?vi?=|\&vi?=)([^#\&\?]*).*/

ต้องparsed[2]เปลี่ยนเป็นparsed[3]สองแห่งในการทดสอบ (ซึ่งจะผ่านไปพร้อมกับm.youtubeURL ที่เพิ่มในการทดสอบ) แจ้งให้เราทราบหากคุณพบปัญหา


1
คุณควรเพิ่มคนนี้ในชุดสูททดสอบของคุณเพราะมันเป็นปัญหาและ regexp ของคุณมันแก้ไขได้สำหรับฉัน: youtu.be/ve4f400859I ตัวอักษร v ถูกถอดออกใน regexp ก่อนหน้าของฉัน
Mark Odey

1
ฉันได้รับ postive ที่ผิด ๆhttp://youtu.be/หากฉันเพิ่ม/เครื่องหมายนี้ว่าถูกต้อง ใช้งานใน(value) => /^.*(youtu\.be\/|vi?\/|u\/\w\/|embed\/|\?vi?=|\&vi?=)([^#\&\?]*).*/.test(value)
Anima-t3d

ขอบคุณสำหรับความคิดเห็น ฉันยังไม่ได้อัปเดตตัวอย่างของฉัน (ไม่มีเวลาในการทดสอบ) ดังนั้นใครก็ตามที่ใช้รหัสของฉันโปรดทราบ :-)
podperson

สิ่งที่เกี่ยวกับ url of type = m.youtube.com
Mehul Thakkar

@MehulThakkar พวกเขาคล้ายกับ URL ของ youtube.com หรือไม่
podperson

11

TL; DR

จับคู่ตัวอย่าง URL ทั้งหมดกับคำถามนี้และจากนั้นบางส่วน

let re = /^(https?:\/\/)?((www\.)?(youtube(-nocookie)?|youtube.googleapis)\.com.*(v\/|v=|vi=|vi\/|e\/|embed\/|user\/.*\/u\/\d+\/)|youtu\.be\/)([_0-9a-z-]+)/i;
let id = "https://www.youtube.com/watch?v=l-gQLqv9f4o".match(re)[7];

ID จะอยู่ในกลุ่มการแข่งขัน 7 เสมอ

ตัวอย่างสดของ URL ทั้งหมดที่ฉันคว้ามาจากคำตอบสำหรับคำถามนี้: https://regexr.com/3u0d4

คำอธิบายแบบเต็ม:

เนื่องจากมีคำตอบ / ความคิดเห็นมากมายปรากฏขึ้นมีหลายรูปแบบสำหรับ URL วิดีโอ YouTube แม้กระทั่ง TLD หลายตัวที่สามารถปรากฏเป็น "โฮสต์" ได้

คุณสามารถดูรายการรูปแบบทั้งหมดที่ฉันตรวจสอบได้โดยไปที่ลิงก์ regexr ด้านบน

ให้พัง RegExp

^ล็อคสตริงเพื่อเริ่มต้นของสตริง (https?:\/\/)?โปรโตคอลทางเลือก http: // หรือ https: // ?ทำให้ไอเท็มก่อนหน้านี้เป็นทางเลือกดังนั้นsและจากนั้นทั้งกลุ่ม (ทุกสิ่งที่อยู่ในชุดของวงเล็บ) จะเป็นทางเลือก

ตกลงส่วนต่อไปนี้เป็นเนื้อของมัน โดยพื้นฐานแล้วเรามีสองตัวเลือกคือเวอร์ชันต่างๆของ www.youtube.com/...idiid] และลิงก์ที่สั้นลง youtu.be/ [รหัส] รุ่น

(                                                  // Start a group which will match everything after the protocol and up to just before the video id.
  (www\.)?                                         // Optional www.
  (youtube(-nocookie)?|youtube.googleapis)         // There are three domains where youtube videos can be accessed. This matches them.
  \.com                                            // The .com at the end of the domain. 
  .*                                               // Match anything 
  (v\/|v=|vi=|vi\/|e\/|embed\/|user\/.*\/u\/\d+\/) // These are all the things that can come right before the video id. The | character means OR so the first one in the "list" matches.
  |                                                // There is one more domain where you can get to youtube, it's the link shortening url which is just followed by the video id. This OR separates all the stuff in this group and the link shortening url.
  youtu\.be\/                                      // The link shortening domain
)                                                  // End of group

ในที่สุดเราก็มีกลุ่มให้เลือกรหัสวิดีโอ อย่างน้อยหนึ่งตัวอักษรที่เป็นตัวเลขตัวอักษรขีดล่างหรือเส้นประ

([_0-9a-z-]+)

คุณสามารถค้นหารายละเอียดเพิ่มเติมเกี่ยวกับแต่ละส่วนของ regex โดยมุ่งไปที่ลิงค์ regexr และดูว่าแต่ละส่วนของนิพจน์นั้นตรงกับข้อความใน url อย่างไร


10

ทางออกที่ดีที่สุด (จาก 2019-2020) ฉันพบคือ:

function YouTubeGetID(url){
   url = url.split(/(vi\/|v=|\/v\/|youtu\.be\/|\/embed\/)/);
   return (url[2] !== undefined) ? url[2].split(/[^0-9a-z_\-]/i)[0] : url[0];
}

ผมพบว่ามันนี่

/*
* Tested URLs:
var url = 'http://youtube.googleapis.com/v/4e_kz79tjb8?version=3';
url = 'https://www.youtube.com/watch?feature=g-vrec&v=Y1xs_xPb46M';
url = 'http://www.youtube.com/watch?feature=player_embedded&v=Ab25nviakcw#';
url = 'http://youtu.be/Ab25nviakcw';
url = 'http://www.youtube.com/watch?v=Ab25nviakcw';
url = '<iframe width="420" height="315" src="http://www.youtube.com/embed/Ab25nviakcw" frameborder="0" allowfullscreen></iframe>';
url = '<object width="420" height="315"><param name="movie" value="http://www.youtube-nocookie.com/v/Ab25nviakcw?version=3&amp;hl=en_US"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube-nocookie.com/v/Ab25nviakcw?version=3&amp;hl=en_US" type="application/x-shockwave-flash" width="420" height="315" allowscriptaccess="always" allowfullscreen="true"></embed></object>';
url = 'http://i1.ytimg.com/vi/Ab25nviakcw/default.jpg';
url = 'https://www.youtube.com/watch?v=BGL22PTIOAM&feature=g-all-xit';
url = 'BGL22PTIOAM';
*/

TypeScript: const youTubeGetID = (url: string) => {const [a,, b] = url .replace (/ (> | <) / gi, '') .split (/ (vi \ / | v = | \ /v\/|youtu\.be\/|\/embed\/)/); if (b! == undefined) {return b.split (/ [^ 0-9a-z _-] / i) [0]; } else {ส่งคืน a; }};
วลาด

ล้มเหลวสำหรับ v = nfDGK_WSFro
Deen John

6

เนื่องจากรหัสวิดีโอของ YouTube ถูกตั้งค่าเป็น11 ตัวอักษรเราสามารถทำได้เพียงแค่substringเราแยก URL v=หลังจากนั้น จากนั้นเราจะไม่ขึ้นอยู่กับเครื่องหมายและท้ายที่สุด

var sampleUrl = "http://www.youtube.com/watch?v=JcjoGn6FLwI&asdasd";

var video_id = sampleUrl.split("v=")[1].substring(0, 11)

ดีและเรียบง่าย :)


อันนี้ซ้ำซ้อนกับคำตอบที่ยอมรับ
brasofilo

5

ฉันได้สรุปข้อเสนอแนะทั้งหมดและนี่คือคำตอบทั่วไปและสั้นสำหรับคำถามนี้:

if(url.match('http://(www.)?youtube|youtu\.be')){
    youtube_id=url.split(/v\/|v=|youtu\.be\//)[1].split(/[?&]/)[0];
}

5

รหัส Java: (ใช้งานได้กับ URL ทั้งหมด:

  1. http://www.youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index
  2. http://www.youtube.com/user/IngridMichaelsonVEVO#p/a/u/1/QdK8U-VIH_o
  3. http://youtube.googleapis.com/v/0zM3nApSvMg?fs=1&hl=en_US&rel=0
  4. http://www.youtube.com/watch?v=0zM3nApSvMg#t=0m10s
  5. http://www.youtube.com/embed/0zM3nApSvMg?rel=0 "
  6. http://www.youtube.com/watch?v=0zM3nApSvMg
  7. http://youtu.be/0zM3nApSvMg
  8. http://www.youtube.com/watch?v=0zM3nApSvMg/
  9. http://www.youtube.com/watch?feature=player_detailpage&v=8UVNT4wvIGY

)

    String url = "http://www.youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index";

    String regExp = "/.*(?:youtu.be\\/|v\\/|u/\\w/|embed\\/|watch\\?.*&?v=)";
    Pattern compiledPattern = Pattern.compile(regExp);
    Matcher matcher = compiledPattern.matcher(url);
    if(matcher.find()){
        int start = matcher.end();
        System.out.println("ID : " + url.substring(start, start+11));

    }

สำหรับ DailyMotion:

String url = "http://www.dailymotion.com/video/x4xvnz_the-funny-crash-compilation_fun";

    String regExp = "/video/([^_]+)/?";
    Pattern compiledPattern = Pattern.compile(regExp);
    Matcher matcher = compiledPattern.matcher(url);
    if(matcher.find()){
        String match = matcher.group();
        System.out.println("ID : " + match.substring(match.lastIndexOf("/")+1));

    }

1
ลบเครื่องหมายคำพูดคู่จากรอบ ๆ รูปแบบ Regex ในรหัส JavaScript และควรใช้งานได้
TheDude

4

รุ่นที่เข้มงวดขึ้นเล็กน้อย:

^https?://(?:www\.)?youtu(?:\.be|be\.com)/(?:\S+/)?(?:[^\s/]*(?:\?|&)vi?=)?([^#?&]+)

ทดสอบเมื่อ:

http://www.youtube.com/user/dreamtheater#p/u/1/oTJRivZTMLs
https://youtu.be/oTJRivZTMLs?list=PLToa5JuFMsXTNkrLJbRlB--76IAOjRM9b
http://www.youtube.com/watch?v=oTJRivZTMLs&feature=youtu.be
https://youtu.be/oTJRivZTMLs
http://youtu.be/oTJRivZTMLs&feature=channel
http://www.youtube.com/ytscreeningroom?v=oTJRivZTMLs
http://www.youtube.com/embed/oTJRivZTMLs?rel=0
http://youtube.com/v/oTJRivZTMLs&feature=channel
http://youtube.com/v/oTJRivZTMLs&feature=channel
http://youtube.com/vi/oTJRivZTMLs&feature=channel
http://youtube.com/?v=oTJRivZTMLs&feature=channel
http://youtube.com/?feature=channel&v=oTJRivZTMLs
http://youtube.com/?vi=oTJRivZTMLs&feature=channel
http://youtube.com/watch?v=oTJRivZTMLs&feature=channel
http://youtube.com/watch?vi=oTJRivZTMLs&feature=channel

4

คุณสามารถใช้รหัสต่อไปนี้เพื่อรับรหัสวิดีโอ YouTube จาก URL:

url = "https://www.youtube.com/watch?v=qeMFqkcPYcg"
VID_REGEX = /(?:youtube(?:-nocookie)?\.com\/(?:[^\/\n\s]+\/\S+\/|(?:v|e(?:mbed)?)\/|\S*?[?&]v=)|youtu\.be\/)([a-zA-Z0-9_-]{11})/
alert(url.match(VID_REGEX)[1]);

ฉันมีปัญหากับตัวอย่าง regex อื่น ๆ ทั้งหมด แต่อันนี้ทำงานได้อย่างมีประสิทธิภาพกับตัวเลือกการแชร์ 3 รายการที่ผู้ใช้บนเดสก์ท็อปใช้ URL จากแถบที่อยู่ URL จากปุ่มแบ่งปันและ URL จากปุ่มแบ่งปันในบรรทัด ขอบคุณ !!!
Maarten

2

รุ่นที่เปลี่ยนแปลงเล็กน้อยจากหนึ่ง mantish ที่โพสต์:

var regExp = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]{11,11}).*/;
var match = url.match(regExp);
if (match) if (match.length >= 2) return match[2];
// error

นี่ถือว่ารหัสเป็น 11 อักขระเสมอ ฉันใช้สิ่งนี้ใน ActionScript ไม่แน่ใจว่ารองรับ Javascript ได้ {11,11} เพิ่มการรองรับสำหรับ & v = .... (ในกรณี)


นี่เป็นสิ่งเดียวที่ทำงานกับ URL ที่ฉันกำลังทดสอบด้วย: youtube.com/watch?feature=player_embedded&v=0zM3nApSvMg
โดมินิก

สมบูรณ์ ขอบคุณชุดลิงก์ @Josha 69 ฉันทดสอบทั้งหมดใช้งานได้สำหรับฉัน
gokhan


2

อีกหนึ่ง:

var id = url.match(/(^|=|\/)([0-9A-Za-z_-]{11})(\/|&|$|\?|#)/)[2]

ใช้งานได้กับ URL ใด ๆ ที่แสดงในชุดข้อความนี้

มันจะไม่ทำงานเมื่อ YouTube เพิ่มพารามิเตอร์อื่น ๆ ที่มี 11 base64 ตัวอักษร จนเป็นวิธีที่ง่าย


2

ฉันทำฟังก์ชั่นขนาดเล็กเพื่อดึงรหัสวิดีโอออกจาก URL ของ Youtube ซึ่งสามารถดูได้ด้านล่าง

var videoId = function(url) {
   var match = url.match(/v=([0-9a-z_-]{1,20})/i);
   return (match ? match['1'] : false);
};

console.log(videoId('https://www.youtube.com/watch?v=dQw4w9WgXcQ'));
console.log(videoId('https://www.youtube.com/watch?t=17s&v=dQw4w9WgXcQ'));
console.log(videoId('https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=17s'));

ฟังก์ชันนี้จะแยกรหัสวิดีโอแม้ว่าจะมีหลายพารามิเตอร์ใน URL


2

นี่สามารถรับรหัสวิดีโอได้จากลิงก์ youtube ทุกประเภท

var url= 'http://youtu.be/0zM3nApSvMg';
var urlsplit= url.split(/^.*(youtu.be\/|v\/|embed\/|watch\?|youtube.com\/user\/[^#]*#([^\/]*?\/)*)\??v?=?([^#\&\?]*).*/);
console.log(urlsplit[3]);

1

ฉันชอบคำตอบของ Surya .. แค่กรณีที่มันไม่ทำงาน ...

String regExp = "/.*(?:youtu.be\\/|v\\/|u/\\w/|embed\\/|watch\\?.*&?v=)";

ไม่ได้ผล

youtu.be/i4fjHzCXg6c  and  www.youtu.be/i4fjHzCXg6c

รุ่นที่อัพเดท:

String regExp = "/?.*(?:youtu.be\\/|v\\/|u/\\w/|embed\\/|watch\\?.*&?v=)";

ใช้ได้กับทุกคน


1

ลองอันนี้ -

function getYouTubeIdFromURL($url) 
{
  $pattern = '/(?:youtube.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu.be/)([^"&?/ ]{11})/i';
  preg_match($pattern, $url, $matches);

  return isset($matches[1]) ? $matches[1] : false;
}

1

ตัวอย่างการทำความสะอาดของ Chris Nolet ของคำตอบ Lasnv นั้นดีมาก แต่เมื่อเร็ว ๆ นี้ฉันพบว่าหากคุณพยายามหาลิงก์ youtube ของคุณในข้อความและใส่ข้อความสุ่มหลังจาก url ของ youtube, regexp ตรงกับที่ต้องการมากกว่า ปรับปรุงคำตอบของ Chris Nolet:

/^.*(?:youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=)([^#\&\?]{11,11}).*/


1
function parser(url){
    var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\/)|(\?v=|\&v=))([^#\&\?]*).*/;
    var match = url.match(regExp);
    if (match && match[8].length==11){
            alert('OK');
    }else{
            alert('BAD');
    }
}

สำหรับการทดสอบ:

https://www.youtube.com/embed/vDoO_bNw7fc - attention first symbol «v» in «vDoO_bNw7fc»

http://www.youtube.com/user/dreamtheater#p/u/1/oTJRivZTMLs
https://youtu.be/oTJRivZTMLs?list=PLToa5JuFMsXTNkrLJbRlB--76IAOjRM9b
http://www.youtube.com/watch?v=oTJRivZTMLs&feature=youtu.be
https://youtu.be/oTJRivZTMLs
http://youtu.be/oTJRivZTMLs&feature=channel
http://www.youtube.com/ytscreeningroom?v=oTJRivZTMLs
http://www.youtube.com/embed/oTJRivZTMLs?rel=0
http://youtube.com/v/oTJRivZTMLs&feature=channel
http://youtube.com/v/oTJRivZTMLs&feature=channel
http://youtube.com/vi/oTJRivZTMLs&feature=channel
http://youtube.com/?v=oTJRivZTMLs&feature=channel
http://youtube.com/?feature=channel&v=oTJRivZTMLs
http://youtube.com/?vi=oTJRivZTMLs&feature=channel
http://youtube.com/watch?v=oTJRivZTMLs&feature=channel
http://youtube.com/watch?vi=oTJRivZTMLs&feature=channel

0

วิธีการแยกวิเคราะห์แบบง่าย ๆ ก็คือ: รับทุกสิ่งที่เริ่มต้นหลังจากเครื่องหมาย=แรกไปที่ป้าย&แรก

ฉันคิดว่าพวกเขามีคำตอบที่คล้ายกันที่นี่:

แยกวิเคราะห์ Vimeo ID โดยใช้ JavaScript หรือไม่


2
และถ้า URL ไม่มี&?
อดัม

จากนั้นคุณจะต้องค้นหาสิ่งที่เป็นตัวคั่นเทียบเท่า ตัวอย่างเช่น URL แรกที่คุณให้ & เครื่องหมาย บน URL ที่สองจุดสิ้นสุดของสตริงคือตัวคั่น
karlphillip

0

เรารู้ว่าตัวอักษรเหล่านี้ "? v =" ไม่สามารถปรากฏได้มากกว่าตัวอักษร แต่ 'v' สามารถปรากฏใน Id It เองเราจึงใช้ "? v =" เป็นตัวคั่น เห็นมันทำงานที่นี่

//Get YouTube video Id From Its Url

     $('button').bind('click',function(){
var 
url='http://www.youtube.com/watch?v=u8nQa1cJyX8',
videoId = url.split('?v='),//Split data to two
YouTubeVideoId=videoId[1];
alert(YouTubeVideoId);return false;

});

<button>Click ToGet VideoId</button>

0

regex ง่าย ๆ ถ้าคุณมี URL แบบเต็มให้มันง่าย

results = url.match("v=([a-zA-Z0-9]+)&?")
videoId = results[1] // watch you need.

0
var video_url = document.getElementById('youtubediv').value;
        if(video_url!=""){
        ytid(video_url);
        document.getElementById("youtube").setAttribute("src","http://www.youtube.com/embed/"+ytid(video_url));
        }
        function ytid(video_url){
            var video_id = video_url.split('v=')[1];
            var ampersandPosition = video_id.indexOf('&');
            if(ampersandPosition != -1) {
                video_id = video_id.substring(0, ampersandPosition);
            }
            return video_id;
        }

ฉันหวังว่ามันจะช่วยได้


0
function youtube_parser(url){
    var match = url.match(/^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/);
    return (match&&match[7].length==11)?match[7]:false;
}

สั้นและมีประสิทธิภาพ


ไม่ถูกต้องล้มเหลว VS youtube.com/e/dQw4w9WgXcQดังนั้นโปรดนำออกจากส่วนที่มีประสิทธิภาพ :)
alecellis1985

0

ในฐานะที่เป็น webstrap กล่าวถึงในความคิดเห็น :

มันทำงานได้ถ้าวิดีโอเริ่มต้นด้วย "v" และมาจาก youtu.be

regex มีข้อผิดพลาดเล็ก ๆ น้อย ๆ\??v?=?เพียงแค่นี้ควรจะเป็นส่วนหนึ่งของนาฬิกามิฉะนั้นคุณจะกรองถ้าประชาชนได้เริ่มต้นด้วย'v' 'v'ดังนั้นสิ่งนี้ควรทำเคล็ดลับ

/^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\??v?=?))([^#\&\?]*).*/

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