我想知道如何根据使用单个正则表达式的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。
答案 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链接。这会抓取所有v
和lists
:
/(?:(?:\?|&)(?: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
<强>更新强>
我更新正则表达式(感谢您注释以捕获下划线),并使第一组非捕获
更新也捕获:youtu.be/cCnrX1w5luM
/(:???\ V = | \列表= |是/)(\ W )/ G *