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

Amr*_*era 1 javascript regex youtube

我想从 YouTube 的视频网址返回视频 ID,即使对于Shorts也是如此。

但我有适用于一些不包括Shorts 的网址的模式

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

编辑: 它应该适用于以下网址:

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
Run Code Online (Sandbox Code Playgroud)

谢谢

dom*_*omi 11

这应该适用于提供的示例

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

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

  • Group1:直到最后一部分的 URL
  • Group2:接收 videoId 作为参数的 url 的最后一部分
  • Group3:url 中的最后一部分(即 "/v/" 、 "/embed/"、"/user/"、"/shorts/" 和 "youtu.be/" 变体中的 videoId ),或者videoId 参数(在观看的情况下)

你可以像这样在 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]);
Run Code Online (Sandbox Code Playgroud)

或者,如果您一次只期望一个 url:

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

请记住,javascript 中的正则表达式不是无状态的,多次运行相同的正则表达式将导致它迭代文本中的匹配项(并最终在到达末尾后返回 NULL),这就是正则表达式重新初始化的原因在这种情况下的每个呼叫。如果没有找到匹配项,它也将返回 null。