Làm cách nào để có được ID video YouTube từ một URL?


257

Tôi muốn lấy v=idURL từ YouTube bằng JavaScript (không có jQuery, JavaScript thuần).

Ví dụ định dạng URL YouTube

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

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

Hoặc bất kỳ định dạng YouTube nào khác có chứa ID video trong URL.

Kết quả từ các định dạng này

u8nQa1cJyX8



Câu hỏi đó chỉ dành cho các định dạng như câu hỏi thứ hai của tôi. Nhưng tôi đã tìm thấy một câu trả lời thú vị ở đó, cảm ơn vì đã chia sẻ nó.
Adam

Có một biểu thức chính quy cho điều đó: http://pregcopy.com/Ex/27
Exos

Không thể nhận bất kỳ khoản tín dụng nào cho nó, nhưng tôi thấy điều này khá rộng: gist.github.com/FinalAngel/1876898 . Nó thậm chí còn bắt các url đa dạng như youtube.com/watch?feature=player_embedded&v=1p3vcRhsYGoyoutube.com/v/1p3vcRhsYGo
Simon

2
Kể từ năm 2015: bỏ qua câu trả lời này . Các câu trả lời khác đã hết hạn.
Lenar Hoyt

Câu trả lời:


109

Bạn không cần phải sử dụng biểu thức chính quy cho việc này.

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

đây là một hàm hữu ích để làm cho nó hoạt động ở nơi bạn muốn dựa trên mã này. var video_url = ' youtube.com/watch?v=eOrNdBpGMv8&feature=youtube_gdata '; ytid (video_url); hàm ytid (video_url) {var video_id = video_url.split ('v =') [1]; var ampersandP vị trí = video_id.indexOf ('&'); if (ampersandPocation! = -1) {video_id = video_id.subopes (0, ampersandPocation); } cảnh báo (video_id); trả lại video_id; }
Gino

9
không xử lý các URL được nhúng
Serge

14
cũng không xử lý các url được chia sẻ 'https://youtu.be/{{video_id}}
hamncheez

2
Regex này hoạt động tốt với chia sẻ youtube và xem url. url='https://youtu.be/{{video_id}}'; url.match(/(?:https?:\/{2})?(?:w{3}\.)?youtu(?:be)?\.(?:com|be)(?:\/watch\?v=|\/)([^\s&]+)/);
Dipten

410

Tôi đã thực hiện một cải tiến cho Regex do "jeffreypriebe" cung cấp vì anh ta cần một loại URL YouTube là URL của các video khi họ đang xem qua một kênh.

À không nhưng đây là chức năng mà tôi đã trang bị.

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

Đây là các loại URL được hỗ trợ

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

Có thể được tìm thấy trong [http://web.archive.org/web/20160926134334/] http://lasnv.net/foro/839/Javascript_parsear_URL_de_YouTube


6
Regex chứa một lỗi nhỏ \ ?? v? =? cái này chỉ nên ở phần đồng hồ, nếu không bạn sẽ lọc 'v' nếu id bắt đầu bằng 'v'. vì vậy, điều này sẽ thực hiện mánh khóe / ^ ..* ((youtu.be\ /) | (v \ /) | (\ / u \ / \ w \ /) | =?)) ([^ # \ & \?] *). * /
webstrap

69
Thậm chí sạch hơn: /.*(?:youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=)([^#\&\?]*).*/ Sau đó sử dụng match[1]thay vì match[7](có vẻ hơi tùy tiện với tôi). Cũng sửa lỗi được chỉ ra bởi WebDev.
Chris Nolet

3
Mất bao lâu cho đến khi ID YouTube dài 12 ký tự?
Lenar Hoyt

1
Bạn có biết rằng nó không thực sự hoàn hảo, nếu bạn đặt bất cứ thứ
Gino

1
Bất cứ ai cũng có thể mở rộng reqex này và do đó mọi người phàn nàn không có ý nghĩa gì.
Lecha Bisultanov

241

Tôi đã đơn giản hóa câu trả lời của Lasnv một chút.

Nó cũng sửa lỗi mà WebDeb mô tả.

Đây là:

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
}

Đây là một liên kết regexer để chơi với: http://regexr.com/3dnqv


2
chỉ cần đề phòng: điều này chỉ nên được sử dụng khi bạn biết rằng bạn đang xử lý một url youtube. Tôi (đã sai) đã sử dụng nó để xác minh các url như youtube, điều này gây ra lỗi tích cực, ví dụ: điều này vượt qua: 'v / 2059-9080-5437'
fabi

3
Hiện tôi đang sử dụng một Regex khác cũng kiểm tra tên miền youtube. Tôi không chắc mình có nên cập nhật câu trả lời không vì đây là một thay đổi lớn: / ^. ^ (Youtu.be\ / | yy (- nookookie) ?.com \ / (v\ / |.*u\ / \ \ / | nhúng \ / |. * V =)) ([\ w -] {11}). * /
mantish

4
Khi nào YouTube sẽ chuyển sang 12 ký tự cho ID video?
Lenar Hoyt

không nên thoát dấu chấm trong "youtu.be"?
Alex

bạn nói đúng @jitbit Cảm ơn bạn. Mặc dù nó thường hoạt động tốt mà không thoát khỏi nó.
mantish

85

Không ai trong số này làm việc trên bồn rửa nhà bếp kể từ 1/1/2015, đáng chú ý là các URL không có http / s tiêu đề và với tên miền youtube-nocookie. Vì vậy, đây là phiên bản sửa đổi hoạt động trên tất cả các phiên bản Youtube khác nhau này:

// 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
Đáng lưu ý rằng nhiều giải pháp trên không bao gồm lô url hợp lệ này, tập lệnh thử nghiệm rất hữu ích, +1!
thổi vào

2
Lưu ý rằng điều này sẽ bị đánh lừa bởi một cái gì đó như "www.engadget.com/watch?v=dQw4w9WgXcQ", không phải đó có thể là một vấn đề mặc dù
binaryfunt

Nó hoạt động, nhưng không thể khắc phục sự cố phát sinh một văn bản có nhiều url youtube Xem regex101.com/r/qK5qJ5/1 này . Nó không nên thay thế url thứ hai.
Ashish

2
Nếu bạn không muốn một ID trống khớp với : ^.*(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/)|(?:(?:watch)?\?v(?:i)?=|\&v(?:i)?=))([^#\&\?]+).*(ví dụ youtube.com/watch?v= sẽ không khớp)
zurfyx

Bạn có ý nghĩa gì bởi "Không ai trong số này làm việc trên bồn rửa nhà bếp"?
rmutalik

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

Đã thử nghiệm trên:

  • http://www.youtube.com/v/0zM3nApSvMg?fs=1&hl=vi_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=vi_US&rel=0

Lấy cảm hứng từ câu trả lời khác này .


9
^. * (?: youtu.be \ / | v \ / | e \ / | u \ / \ w + \ / | embed \ / | v =) ([^ # \ & \?] *). * sẽ cung cấp bạn kết quả trong nhóm 1
Marc

20

Vì YouTube có nhiều kiểu URL khác nhau, tôi nghĩ Regex là một giải pháp tốt hơn. Đây là Regex của tôi:

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

Nhóm 3 có ID YouTube của bạn

Các URL YouTube mẫu (hiện tại, bao gồm "kiểu URL nhúng kế thừa") - Regex ở trên hoạt động trên tất cả các URL đó:

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

Mũ cho Lasnv


9
Bạn thực sự cần phải quay lại bảng vẽ với cái này. Có, nó phù hợp với các URL trên một cách chính xác. Nhưng nó cũng nhầm với nhiều chuỗi không phải là youtube-url khác như : "domain.com/embed/file.txt", "/tv/""Has anyone seen my watch?". Xem: câu trả lời của tôi cho một câu hỏi tương tự cho một giải pháp chính xác hơn nhiều.
Ridgerunner

1
Tôi thấy quan điểm của bạn: regex ở trên là vô ích khi trả lời câu hỏi "Đây có phải là URL YouTube không?" Nhưng đó không phải là mục tiêu của tôi. Tôi có URL YouTube - Tôi chỉ trích xuất một ID. Có, câu trả lời của bạn là vững chắc (và bao gồm một trường hợp sử dụng mà tôi không biết).
jeffreypriebe

bạn có cùng một lỗi tôi đã đề cập ở trên với id bắt đầu bằng 'v'
webstrap

Cảm ơn @WebDev - bạn có biết YouTube có bao giờ đặt av vào ID không (hoặc bắt đầu ID bằng "v")?
jeffreypriebe

1
Vẫn hoạt động như ngày hôm nay (2013-01-25). Đây là một ví dụ về hành động: jsfiddle.net/bcmoney/yBP4J
bcmoney

17

Tôi đã tạo một chức năng kiểm tra đầu vào của người dùng cho ID nhúng Youtube, Soundcloud hoặc Vimeo, để có thể tạo ra một thiết kế liên tục hơn với phương tiện được nhúng. Hàm này phát hiện và trả về một đối tượng với các thuộc tính: "type" và "id". Loại có thể là "youtube", "vimeo" hoặc "soundcloud" và thuộc tính "id" là id phương tiện duy nhất.

Trên trang web tôi sử dụng kết xuất textarea, nơi người dùng có thể dán vào bất kỳ loại liên kết hoặc mã nhúng nào, bao gồm cả nhúng iFrame của cả vimeo và 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;
}

Ý tưởng hay, nhưng nó không hoạt động trên phần lớn các định dạng URL. Bao gồm không phù hợp trên bất kỳ trang web https.
NickG

13

Cuối trò chơi ở đây, nhưng tôi đã nghiền ngẫm hai câu trả lời xuất sắc từ mantish và jw. Đầu tiên, regex sửa đổi:

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

Đây là mã kiểm tra (Tôi đã thêm các trường hợp kiểm tra ban đầu của mantish vào các trường hợp khó khăn hơn của 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');
  }

Phiên bản thử nghiệm để xử lý m.youtube url được đề cập trong các nhận xét:

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

Nó đòi hỏi parsed[2]phải được thay đổi thành parsed[3]hai nơi trong các bài kiểm tra (sau đó nó sẽ vượt qua với m.youtubecác url được thêm vào các bài kiểm tra). Hãy cho tôi biết nếu bạn thấy vấn đề.


1
Bạn nên thêm cái này vào bộ đồ thử nghiệm của bạn vì nó có vấn đề và regrec của bạn đã giải quyết nó cho tôi: youtu.be/ve4f400859I . Chữ v đã bị loại bỏ trong
regrec

1
Tôi nhận được tư thế sai http://youtu.be/nếu tôi thêm /nó đánh dấu nó là hợp lệ. Sử dụng nó trong(value) => /^.*(youtu\.be\/|vi?\/|u\/\w\/|embed\/|\?vi?=|\&vi?=)([^#\&\?]*).*/.test(value)
Anima-t3d

Cảm ơn các ý kiến. Tôi chưa cập nhật ví dụ của mình (chưa có thời gian để kiểm tra) vì vậy bất kỳ ai sử dụng mã của tôi xin vui lòng lưu ý :-)
podperson

Điều gì về url của loại = m.youtube.com
Mehul Thakkar

@MehulThakkar họ có giống với url của youtube không?
podperson

11

tl; dr.

Khớp tất cả các ví dụ URL về câu hỏi này và sau đó một số.

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 sẽ luôn ở trong nhóm 7.

Ví dụ trực tiếp về tất cả các URL tôi đã lấy từ các câu trả lời cho câu hỏi này: https://regexr.com/3u0d4

Giải thích đầy đủ:

Vì nhiều câu trả lời / nhận xét đã đưa ra, có nhiều định dạng cho URL video youtube. Thậm chí nhiều TLD nơi chúng có thể được "lưu trữ".

Bạn có thể xem danh sách đầy đủ các biến thể tôi đã kiểm tra bằng cách theo liên kết regexr ở trên.

Hãy phá vỡ RegExp.

^Khóa chuỗi vào đầu chuỗi. (https?:\/\/)?Các giao thức tùy chọn http: // hoặc https: // Làm ?cho mục trước đó là tùy chọn để stoàn bộ nhóm (mọi thứ được đặt trong một dấu ngoặc đơn) là tùy chọn.

Ok, phần tiếp theo này là thịt của nó. Về cơ bản, chúng tôi có hai tùy chọn, các phiên bản khác nhau của www.youtube.com/...[id] và liên kết rút ngắn phiên bản youtu.be/[id].

(                                                  // 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

Cuối cùng, chúng tôi có nhóm để chọn ID video. Ít nhất một ký tự đó là một số, chữ cái, dấu gạch dưới hoặc dấu gạch ngang.

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

Bạn có thể tìm hiểu chi tiết hơn nhiều về từng phần của biểu thức chính quy bằng cách đi qua liên kết biểu thức chính quy và xem từng phần của biểu thức khớp với văn bản trong url.


10

Giải pháp tốt nhất (từ 2019-2020) tôi thấy là:

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

Tôi tìm thấy nó ở đây .

/*
* 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: chuỗi) => {const [a ,, b] = url .replace (/ (> | <) / gi, '') .split (/ (vi \ / | v = | \ /v\/|youtu\.be\/|\/embed\/)/); if (b! == không xác định) {return b.split (/ [^ 0-9a-z _-] / i) [0]; } khác {trả về a; }};
Vlad

thất bại cho v = nfDGK_WSFro
Deen John

6

Vì id video của YouTube được đặt thành 11 ký tự , chúng tôi có thể chỉ cần substringsau khi chúng tôi chia url v=. Sau đó, chúng tôi không phụ thuộc vào dấu và cuối cùng.

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

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

Đẹp và đơn giản :)


Câu trả lời này đúng là một bản sao của câu trả lời được chấp nhận
brasofilo

5

Tôi đã tóm tắt tất cả các đề xuất và đây là câu trả lời phổ quát và ngắn gọn cho câu hỏi này:

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

5

Mã Java: (Hoạt động cho tất cả các 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=vi_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));

    }

Đối với 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
Xóa các dấu ngoặc kép từ xung quanh mẫu Regex trong mã JavaScript và nó sẽ hoạt động.
TheDude

4

Phiên bản nghiêm ngặt hơn một chút:

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

Đã thử nghiệm trên:

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

Bạn có thể sử dụng mã sau đây để lấy ID video YouTube từ một 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]);

Tôi đã gặp vấn đề với tất cả các ví dụ regex khác nhưng cái này hoạt động hiệu quả trên 3 tùy chọn chia sẻ mà mọi người trên máy tính để bàn sử dụng. một url từ thanh địa chỉ, một url từ nút chia sẻ và một url từ nút chia sẻ nội tuyến. Cảm ơn!!!
Maarten

2

Một phiên bản thay đổi một chút từ một mantish được đăng:

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

Giả định mã này luôn là 11 ký tự. Tôi đang sử dụng tính năng này trong ActionScript, không chắc chắn nếu {11,11} được hỗ trợ trong Javascript. Đồng thời thêm hỗ trợ cho & v = .... (chỉ trong trường hợp)


đây là cái duy nhất hoạt động cho một url tôi đã thử nghiệm với: youtube.com/watch?feature=player_embedded&v=0zM3nApSvMg
Dominic

hoàn hảo. cảm ơn @Josha 69 kết hợp liên kết tôi kiểm tra tất cả là làm việc cho tôi.
gokhan

2

Điều này chắc chắn đòi hỏi regex:

Sao chép vào Ruby IRB:

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

Xem cho tất cả các trường hợp thử nghiệm: https://gist.github.com/blairanderson/b264a15a8faaac9c6318


2

Một lần nữa:

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

Nó hoạt động với bất kỳ URL nào được hiển thị trong chủ đề này.

Nó sẽ không hoạt động khi YouTube thêm một số tham số khác với 11 ký tự base64. Cho đến khi đó là cách dễ dàng.


2

Tôi đã thực hiện một chức năng nhỏ để trích xuất id video từ url Youtube có thể nhìn thấy bên dưới.

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

Hàm này sẽ trích xuất id video ngay cả khi có nhiều tham số trong url.


2

Điều này có thể nhận id video từ bất kỳ loại liên kết youtube nào

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

1

Tôi thích câu trả lời của Surya .. Chỉ là một trường hợp nó không hoạt động ...

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

không làm việc cho

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

phiên bản cập nhật:

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

làm việc cho tất cả.


1

Hãy thử cái này -

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

Ví dụ về câu trả lời Lasnv của Chris Nolet rất tốt, nhưng gần đây tôi phát hiện ra rằng nếu bạn cố gắng tìm liên kết youtube của mình trong văn bản và đặt một số văn bản ngẫu nhiên sau url youtube, thì regex phù hợp hơn mức cần thiết. Cải thiện câu trả lời của 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');
    }
}

Để thử nghiệm:

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

Chà, cách để làm điều đó với phân tích cú pháp đơn giản sẽ là: lấy mọi thứ bắt đầu sau dấu đầu tiên = ký hiệu đầu tiên & ký.

Tôi nghĩ rằng họ đã có một câu trả lời tương tự ở đây:

Phân tích ID Vimeo bằng JavaScript?


2
Và nếu URL không chứa &thì sao?
Adam

Sau đó, bạn phải tìm những gì phân định tương đương. Chẳng hạn, URL đầu tiên bạn cung cấp cho chúng tôi là dấu &. Trên URL thứ hai, cuối chuỗi là dấu phân cách.
karlphillip

0

Chúng tôi biết các ký tự này "? V =" không bao giờ có thể xuất hiện nhiều hơn các ký tự nhưng 'v' có thể xuất hiện bằng cách nào đó trong Id Itself nên chúng tôi sử dụng "? V =" làm dấu phân cách. Xem nó làm việc ở đây

//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 đơn giản nếu bạn có URL đầy đủ, hãy giữ nó đơn giản.

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

tôi hy vọng nó có thể giúp


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

Ngắn nhất và hiệu quả


không đúng, thất bại so với youtube.com/e/dQw4w9WgXcQ vì vậy vui lòng rút phần hiệu quả :)
alecellis1985

0

Như webstrap đã đề cập trong một bình luận :

Nó hoạt động nếu video bắt đầu bằng "v" và nó từ youtu.be

Regex chứa một lỗi nhỏ, \??v?=?đây chỉ là phần đồng hồ, nếu không bạn sẽ lọc a 'v'nếu id bắt đầu bằng a 'v'. vì vậy điều này nên làm

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

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.