正则表达式从youtube网址中提取视频ID或播放列表ID

时间:2015-08-30 09:38:23

标签: javascript regex youtube

我想知道如何根据使用单个正则表达式的url提取youtube视频ID或播放列表ID。正则表达式还应该确保域名是youtube.com 以下是我需要的一些结果:

提取播放列表ID

    https://www.youtube.com/playlist?list=PLuC2HflhhpLGQ4RgqA76_Gv52fGA0909r
    www.youtube.com/playlist?list=PLuC2HflhhpLGQ4RgqA76_Gv52fGA0909r
    http://www.youtube.com/playlist?list=PLuC2HflhhpLGQ4RgqA76_Gv52fGA0909r
    https://www.youtube.com/embed/videoseries?list=PLuC2HflhhpLGQ4RgqA76_Gv52fGA0909r  

提取视频ID

https://www.youtube.com/watch?v=fqMfRi2gJok&index=1&list=PLuC2HflhhpLGQ4RgqA76_Gv52fGA0909r
https://www.youtube.com/watch?v=fqMfRi2gJok
http://youtu.be/cCnrX1w5luM 
http://youtube.com/embed/cCnrX1w5luM
http://youtube.com/v/cCnrX1w5luM
https://www.youtube.com/v/cCnrX1w5luM
www.youtube.com/v/cCnrX1w5luM
youtube.com/v/cCnrX1w5luM

这些只是示例网址。我需要为所有可能的youtube链接结构提取相应的ID。

简而言之,提取视频ID,如果不存在,则获取播放列表ID。

3 个答案:

答案 0 :(得分:6)

您的问题明确有两种模式

第一个:

^.*?(?:v|list)=(.*?)(?:&|$)

对于任何具有显式属性的网址,或者您可以说网址中包含=个符号。

<强>解释

^.*?(?:v|list)=:字词v=list=之前的任何字符串,我们更喜欢v而不是list

(.*?)(?:&|$):以&符号或结束符号$结尾的任何字符串,我们更喜欢&而不是$

第二个:

^(?:(?!=).)*\/(.*)$

对于任何没有属性或网址中没有=符号的网址。

<强>解释

^(?:(?!=).)*\/:任何字符串没有=符号(此处由否定前瞻(?!=)处理)到/符号,

(.*)$:直到行尾的任何字符串。

将它们合并为一个正则表达式

^(?:https?:\/\/)?(?:www\.)?youtu\.?be(?:\.com)?.*?(?:v|list)=(.*?)(?:&|$)|^(?:https?:\/\/)?(?:www\.)?youtu\.?be(?:\.com)?(?:(?!=).)*\/(.*)$

这里,

添加了

(?:https?:\/\/)?(?:www\.)?youtu\.?be(?:\.com)?来处理各种形式的www.youtube.com网址

这可以帮助你得到你想要的东西

请参阅:DEMO

重要提示:这个问题,提问者希望从www.youtube.com中提取id,而不是“视频ID”而不是“播放列表ID”。

答案 1 :(得分:4)

https://regex101.com/r/mI3qY9/4

此正则表达式假设您正在为其提供合法的Youtube链接。这会抓取所有vlists

/(?:(?:\?|&)(?:v|list)=|embed\/|v\/|youtu\.be\/)((?!videoseries)[a-zA-Z0-9_]*)/g

<强>故障:

/
(?:                         //non-capturing group
  (?:\?|&)(?:v|list)=       //? or & following a v or list
  |                         //or
  embed\/                   //embed/
  |                         //or
  v\/                       //v/            
  |                         //or
  youtu\.be\/               //youtu.be/
)
(
  (?!videoseries)           //will not capture "videoseries"
  [a-zA-Z0-9_]*             //capture any alphabet digits or underscore that follows afterwards
)          
/g                          //global

但您可能无法分辨哪个是v,哪个是list,所以,

这只会抓取v

/(?:(?:\?|&)v=|embed\/|v\/|youtu\.be\/)((?!videoseries)[a-zA-Z0-9_]*)/g

这只会抓取list

/(?:(?:\?|&)list=)((?!videoseries)[a-zA-Z0-9_]*)/g

这只会抓取YouTube v

/(?:youtube\.com.*(?:\?|&)(?:v)=|youtube\.com.*embed\/|youtube\.com.*v\/|youtu\.be\/)((?!videoseries)[a-zA-Z0-9_]*)/g

仅限YouTube list

/(?:youtube\.com.*(?:\?|&)(?:list)=)((?!videoseries)[a-zA-Z0-9_]*)/g

这基本相同,但正在向正则表达式添加youtube\.com.*。它不会抓住,例如http://example.com/v/abc

https://regex101.com/r/mI3qY9/5

<强>解释

youtube\.com.*          //Matches youtube.com and any multiple characters followed

答案 2 :(得分:1)

这是:

/\?(?:v|list)=(\w*)/g

您可以使用regexp或(|)

您可以在此处测试并查看:

https://regex101.com/r/mI3qY9/2

enter image description here

<强>更新

我更新正则表达式(感谢您注释以捕获下划线),并使第一组非捕获

更新也捕获:youtu.be/cCnrX1w5luM

/(:???\ V = | \列表= |是/)(\ W )/ G *

https://regex101.com/r/mI3qY9/6