Javascript YouTube 视频和短片 ID 的正则表达式

Javascript Regex for YouTube video and shorts id

我想要 return 来自 YouTube 视频 url 的视频 ID,即使是 Shorts

但是我得到了适用于少数 url 的图案,其中不包括 短裤

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

编辑: 它应该适用于以下 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&hl=en_US&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
https://youtube.com/shorts/0dPkkQeRwTI?feature=share
https://youtube.com/shorts/0dPkkQeRwTI

谢谢

这应该适用于提供的示例

(youtu.*be.*)\/(watch\?v=|embed\/|v|shorts|)(.*?((?=[&#?])|$))

https://regex101.com/r/5JhmpW/1 实际视频id应该是每场比赛的第三个捕获组。

  • 第 1 组:Url 到最后一部分
  • Group2:url 的最后一部分接收 videoId 作为参数
  • Group3:url 中的最后一部分(即“/v/”、“/embed/”、“/user/”、“/shorts/”和“ youtu.be/" variants ), 或 videoId 参数(在 watch 的情况下)

您可以像这样在 javascript 中使用它:

let data = `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&hl=en_US&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
https://youtube.com/shorts/0dPkkQeRwTI?feature=share
https://youtube.com/shorts/0dPkkQeRwTI`;
let regex = /(youtu.*be.*)\/(watch\?v=|embed\/|v|shorts|)(.*?((?=[&#?])|$))/gm;
let videoIds = [...data.matchAll(regex)].map(x => x[3]);

或者如果您一次只希望 url:

function getVideoId(url) {
    let regex = /(youtu.*be.*)\/(watch\?v=|embed\/|v|shorts|)(.*?((?=[&#?])|$))/gm;
    return regex.exec(url)[3];
}

请记住 javascript 中的正则表达式不是无状态的,运行 同一正则表达式多次将导致它遍历文本中的匹配项(最终 return NULL一旦它到达终点),这就是为什么在这种情况下每次调用都会重新初始化正则表达式的原因。如果找不到匹配项,它也会 return null。