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.be
和youtube
,第二个\.
应该是可选的(但我没有更改这一点,因为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.be
和 youtube
)。【参考方案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)(?:[\?&][a-zA-Z0-9\_-]+=[a-zA-Z0-9\_-]+)*(?:[&\/\#].*)?$
【讨论】:
【参考方案10】:https://regexr.com/62kgd
^((http|https)\:\/\/)?(www\.youtube\.com|youtu\.?be)\/((watch\?v=)?([a-zA-Z0-9]11))(&.*)*$
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/vimeo url 中提取域和视频 ID
如何使用 Java 中的正则表达式从 YouTube URL 获取视频 ID