开发YouTube视频插入插件:需完善地址验证(含视频ID检测)
解决YouTube视频地址的ID检测问题
嘿,我来帮你搞定视频ID的检测逻辑!YouTube的URL格式有好几种,得先理清这些格式里ID的位置,再用正则表达式来精准捕获,结合你已经实现的域名检测,就能完成完整的验证啦。
先明确YouTube常见的URL格式及ID位置
YouTube的视频地址主要有这几种常见形式,ID的位置各有不同:
- 标准播放页:
https://www.youtube.com/watch?v=abc123XYZ→ ID是abc123XYZ(v=后面的11位字符) - 短链接:
https://youtu.be/abc123XYZ→ ID是斜杠后面的11位字符 - 嵌入地址:
https://www.youtube.com/embed/abc123XYZ→ ID是embed/后面的11位字符 - Shorts短视频:
https://www.youtube.com/shorts/abc123XYZ→ ID是shorts/后面的11位字符
官方规定视频ID是11位字符,由字母、数字、下划线_和连字符-组成,这是我们检测的核心依据。
用正则表达式捕获视频ID
我给你写一个通用的正则表达式,能覆盖上面所有的URL格式,精准提取出视频ID:
/(?:youtube\.com\/(?:[^\/]+\/.+\/|(?:v|e(?:mbed)?)\/|.*[?&]v=)|youtu\.be\/)([^"&?\/\s]{11})/i
这里的i修饰符是用来忽略URL大小写的(比如有的用户输入YOUTUBE.COM也能匹配),各个部分的作用:
(?:youtube\.com\/...):匹配youtube.com域名下的各种路径结构,包括watch页、embed页、shorts页等youtu\.be\/:匹配短链接的域名部分([^"&?\/\s]{11}):捕获11位不包含特殊符号的字符,这就是我们要的视频ID
结合域名检测的完整验证逻辑
把你现有的域名检测和ID检测结合起来,下面给你两个常用语言的实现示例:
JavaScript示例
function isValidYouTubeUrl(url) { // 第一步:检测域名(你已经实现的部分) const hasValidDomain = url.includes('youtube.com') || url.includes('youtu.be'); if (!hasValidDomain) return false; // 第二步:检测并提取视频ID const youtubeRegex = /(?:youtube\.com\/(?:[^\/]+\/.+\/|(?:v|e(?:mbed)?)\/|.*[?&]v=)|youtu\.be\/)([^"&?\/\s]{11})/i; const matchResult = url.match(youtubeRegex); // 验证是否提取到11位的有效ID return matchResult !== null && matchResult[1].length === 11; } // 测试一下: console.log(isValidYouTubeUrl("https://www.youtube.com/watch?v=dQw4w9WgXcQ")); // true console.log(isValidYouTubeUrl("https://youtu.be/dQw4w9WgXcQ")); // true console.log(isValidYouTubeUrl("https://example.com/video")); // false console.log(isValidYouTubeUrl("https://youtube.com/watch?v=short")); // false(ID长度不够)
PHP示例
function isValidYouTubeUrl($url) { // 第一步:检测域名 $hasValidDomain = str_contains($url, 'youtube.com') || str_contains($url, 'youtu.be'); if (!$hasValidDomain) return false; // 第二步:检测并提取视频ID $youtubeRegex = '/(?:youtube\.com\/(?:[^\/]+\/.+\/|(?:v|e(?:mbed)?)\/|.*[?&]v=)|youtu\.be\/)([^"&?\/\s]{11})/i'; preg_match($youtubeRegex, $url, $matches); // 验证ID有效性 return isset($matches[1]) && strlen($matches[1]) === 11; } // 测试: var_dump(isValidYouTubeUrl("https://www.youtube.com/embed/dQw4w9WgXcQ")); // bool(true) var_dump(isValidYouTubeUrl("https://youtube.com/shorts/dQw4w9WgXcQ")); // bool(true) var_dump(isValidYouTubeUrl("https://google.com")); // bool(false)
额外注意点
- 如果你的插件需要处理带额外参数的URL(比如
&t=30s、&list=XXX),这个正则会自动忽略后面的参数,只提取核心的视频ID,完全不影响验证。 - 要是遇到极个别非标准的YouTube URL,你可以根据实际情况微调正则的匹配规则,不过上面的正则已经覆盖了绝大多数用户会用到的场景啦。
内容的提问来源于stack exchange,提问作者Wojciech Urbaniak
相关产品推荐
相关产品推荐

