youtube URL 的正则表达式

Posted

技术标签:

【中文标题】youtube URL 的正则表达式【英文标题】:Regex for youtube URL 【发布时间】:2013-10-23 00:34:04 【问题描述】:

我正在使用以下正则表达式来验证 youtube 视频 share 网址。

var valid = /^(http\:\/\/)?(youtube\.com|youtu\.be)+$/;
alert(valid.test(url));
return false;

我希望正则表达式支持以下 URL 格式:

http://youtu.be/cCnrX1w5luM  
http://youtube/cCnrX1w5luM  
www.youtube.com/cCnrX1w5luM  
youtube/cCnrX1w5luM  
youtu.be/cCnrX1w5luM   

我尝试了不同的正则表达式,但没有找到适合共享链接的正则表达式。谁能帮我解决这个问题。提前致谢。

【问题讨论】:

【参考方案1】: 您的正则表达式中缺少www 如果您想同时匹配youtu.beyoutube,第二个\. 应该是可选的(但我没有更改这一点,因为youtube 实际上不是一个有效的域 - 请参阅下面的注释)李> 正则表达式中的+ 允许(youtube\.com|youtu\.be) 中的一个或多个,而不是一个或多个通配符。 您需要使用. 表示通配符,使用+ 表示您需要其中的一个或多个。

试试:

^(https?\:\/\/)?(www\.youtube\.com|youtu\.be)\/.+$

Live demo.

如果您希望它匹配带有或不带有 www. 的 URL,只需将其设为可选:

^(https?\:\/\/)?((www\.)?youtube\.com|youtu\.be)\/.+$

Live demo.

替代品无效:

如果您希望 www.youtu.be/... 也匹配(在撰写本文时,这似乎不是有效的 URL 格式),请将可选的 www. 放在括号外:

^(https?\:\/\/)?(www\.)?(youtube\.com|youtu\.be)\/.+$

youtube/cCnrX1w5luM(有或没有http://)不是有效的 URL,但问题明确提到正则表达式应该支持它。要包含此内容,请在上述任何正则表达式中将 youtu\.be 替换为 youtu\.?be。 Live demo.

【讨论】:

我认为youtu\.?be 中的问号是错误的:如果 URL 确实指向 http(s)://youtu,您总是希望在 URL 中包含确切的字符串 youtu.be 。是。 ? @TomášPospíšek 已编辑。【参考方案2】:

改为检查此模式:

r'(?i)(http.//|https.//)*[A-Za-z0-9._%+-]+\.\w+'

【讨论】:

【参考方案3】:

试试这个:

((http://)?)(www\.)?((youtube\.com/)|(youtu\.be)|(youtube)).+

http://regexr.com?36o7a

【讨论】:

那里有一些不必要的括号 - ...(youtube\.com/|youtu.be|youtube).*,你可能想在 youtu.be 中转义 .,你可能想把 / 放在外面(所以它被包括在内youtu.beyoutube)。【参考方案4】:

我知道我迟到了 2 年,但无论如何我都需要写一些东西,而且似乎适合我可以提交的所有测试用例。应该能够引用第一个匹配项 ($1) 来获取 ID。匹配 http、https、www 和非 www、youtube.com、youtu.be、/watch?和/watch.php?在 youtube.com 上(youtu.be 不使用这些),即使 URL 字符串中有其他变量(?t= 表示时间,?list= 表示播放列表等),它也支持匹配。

(?:https?:\/\/)?(?:youtu\.be\/|(?:www\.|m\.)?youtube\.com\/(?:watch|v|embed)(?:\.php)?(?:\?.*v=|\/))([a-zA-Z0-9\_-]+)

【讨论】:

你有没有机会更新它以支持youtube.com/watch/IDHERE,这是有效的? @JacobMorrison 又晚了两年,但到底是什么 - 更新了代码:) ^(?:https?:)?(?:\/\/)?(?:youtu\.be\/|(?:www\.|m\.)?youtube\.com\/(?:watch|v|embed)(?:\.php)?(?:\?.*v=|\/))([a-zA-Z0-9\_-]7,15)(?:[\?&][a-zA-Z0-9\_-]+=[a-zA-Z0-9\_-]+)*$ 对其进行了一些改进,以便检查条目以 url 开头和结尾,因此 extra text youtube.com/embed/DFYRQ_zQ-gk extra text 之类的内容无效。还添加了验证id不少于7个符号【参考方案5】:

基于许多其他正则表达式;这是我得到的最好的:

((http(s)?:\/\/)?)(www\.)?((youtube\.com\/)|(youtu.be\/))[\S]+

测试: http://regexr.com/3bga2

【讨论】:

【参考方案6】:

这是我用来匹配和捕获带有视频代码的 YouTube URL 的重要位的正则表达式:

^((?:https?:)?\/\/)?((?:www|m)\.)?((?:youtube\.com|youtu.be))(\/(?:[\w\-]+\?v=|embed\/|v\/)?)([\w\-]+)(\S+)?$

适用于以下网址:

https://www.youtube.com/watch?v=DFYRQ_zQ-gk&feature=featured
https://www.youtube.com/watch?v=DFYRQ_zQ-gk
http://www.youtube.com/watch?v=DFYRQ_zQ-gk
//www.youtube.com/watch?v=DFYRQ_zQ-gk
www.youtube.com/watch?v=DFYRQ_zQ-gk
https://youtube.com/watch?v=DFYRQ_zQ-gk
http://youtube.com/watch?v=DFYRQ_zQ-gk
//youtube.com/watch?v=DFYRQ_zQ-gk
youtube.com/watch?v=DFYRQ_zQ-gk

https://m.youtube.com/watch?v=DFYRQ_zQ-gk
http://m.youtube.com/watch?v=DFYRQ_zQ-gk
//m.youtube.com/watch?v=DFYRQ_zQ-gk
m.youtube.com/watch?v=DFYRQ_zQ-gk

https://www.youtube.com/v/DFYRQ_zQ-gk?fs=1&hl=en_US
http://www.youtube.com/v/DFYRQ_zQ-gk?fs=1&hl=en_US
//www.youtube.com/v/DFYRQ_zQ-gk?fs=1&hl=en_US
www.youtube.com/v/DFYRQ_zQ-gk?fs=1&hl=en_US
youtube.com/v/DFYRQ_zQ-gk?fs=1&hl=en_US

https://www.youtube.com/embed/DFYRQ_zQ-gk?autoplay=1
https://www.youtube.com/embed/DFYRQ_zQ-gk
http://www.youtube.com/embed/DFYRQ_zQ-gk
//www.youtube.com/embed/DFYRQ_zQ-gk
www.youtube.com/embed/DFYRQ_zQ-gk
https://youtube.com/embed/DFYRQ_zQ-gk
http://youtube.com/embed/DFYRQ_zQ-gk
//youtube.com/embed/DFYRQ_zQ-gk
youtube.com/embed/DFYRQ_zQ-gk

https://youtu.be/DFYRQ_zQ-gk?t=120
https://youtu.be/DFYRQ_zQ-gk
http://youtu.be/DFYRQ_zQ-gk
//youtu.be/DFYRQ_zQ-gk
youtu.be/DFYRQ_zQ-gk

https://www.youtube.com/HamdiKickProduction?v=DFYRQ_zQ-gk

捕获的组是:

    协议 子域 域 路径 视频代码 查询字符串

http://regexr.com/3dj5t

【讨论】:

youtube.com/foo_bar- 和 youtube.com/foo_bar 和 youtube.com/watch?v= 不是有效的 YouTube 视频 URL,但此正则表达式会匹配它们。【参考方案7】:

YouTube 视频的格式已更改。此正则表达式适用于所有情况:

^(http(s)??\:\/\/)?(www\.)?((youtube\.com\/watch\?v=)|(youtu.be\/))([a-zA-Z0-9\-_])+

测试here。

【讨论】:

发生了什么变化? phuc77 的回答似乎更好。 使用 phuc77 的答案:regex101.com/r/RyE7OM/2/tests 并非所有这些测试都能通过。具体来说,youtube.com/foo_bar 和 youtube.com/watch?v= 不应验证。 任何寻找解决方案的人都应该使用这个答案。这是迄今为止我发现的最好的。 如果你想捕捉 ID,那么你的正则表达式中有一个错字,最后的 + 号应该在最后一个括号之前,否则它只会捕捉最后一个字母。最终的正则表达式应如下所示^(http(s)??\:\/\/)?(www\.)?((youtube\.com\/watch\?v=)|(youtu.be\/))([a-zA-Z0-9\-_]+) phuc77 似乎更好,这个答案没有通过所有测试:regexr.com/4b2fh【参考方案8】:

我试过这个,对我来说效果很好。

(?:http(?:s)?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user)\/))([^\?&\"'<> #]+)

您可以在这里查看https://regex101.com/r/Kvk0nB/1

【讨论】:

你确定这有效吗?【参考方案9】:

我从这里获取了一个答案,并添加了对我在数据集中注意到的一些边缘情况的支持。这应该适用于几乎任何有效的网址。

^(?:https?:)?(?:\/\/)?(?:youtu\.be\/|(?:www\.|m\.)?youtube\.com\/(?:watch|v|embed)(?:\.php)?(?:\?.*v=|\/))([a-zA-Z0-9\_-]7,15)(?:[\?&amp;][a-zA-Z0-9\_-]+=[a-zA-Z0-9\_-]+)*(?:[&amp;\/\#].*)?$

【讨论】:

【参考方案10】:

https://regexr.com/62kgd

^((http|https)\:\/\/)?(www\.youtube\.com|youtu\.?be)\/((watch\?v=)?([a-zA-Z0-9]11))(&amp;.*)*$

https://www.youtube.com/watch?v=YPz9zqakRbk

https://www.youtube.com/watch?v=YPz9zqakRbk&t=11

http://youtu.be/cCnrX1w5luM&y=12

http://youtu.be/cCnrX1w5luM

http://youtube/cCnrXswsluM

www.youtube.com/cCnrX1w5luM

youtube/cCnrX1w5luM

【讨论】:

以上是关于youtube URL 的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

C# 正则表达式通过 url 从 youtube 和 vimeo 获取视频 ID

YouTube ID 的正则表达式 [重复]

正则表达式从 youtube/vimeo url 中提取域和视频 ID

如何使用 Java 中的正则表达式从 YouTube URL 获取视频 ID

YouTube Vimeo 视频 ID 来自嵌入代码或来自带有 PHP 正则表达式 RegEx 的 URL

Youtube视频网址正则表达式[重复]