我正在尝试为我的应用验证YouTube网址。
到目前为止,我有以下内容:
// Set the youtube URL
$youtube_url = "www.youtube.com/watch?v=vpfzjcCzdtCk";
if (preg_match("/((http\:\/\/){0,}(www\.){0,}(youtube\.com){1} || (youtu\.be){1}(\/watch\?v\=[^\s]){1})/", $youtube_url) == 1)
{
echo "Valid";
else
{
echo "Invalid";
}
我想验证Youtube网址的以下变体:
但是,我不认为我的逻辑是正确的,因为出于某种原因,它会为www.youtube.co/watch?v=vpfzjcCzdtCk
返回 true (注意我用{{{I}错误地写了它1}}而不是.co
)
答案 0 :(得分:34)
你的这个正则表达式中有很多冗余(以及leaning toothpick syndrome)。但是,这应该产生结果:
$rx = '~
^(?:https?://)? # Optional protocol
(?:www[.])? # Optional sub-domain
(?:youtube[.]com/watch[?]v=|youtu[.]be/) # Mandatory domain name (w/ query string in .com)
([^&]{11}) # Video id of 11 characters as capture group 1
~x';
$has_match = preg_match($rx, $url, $matches);
// if matching succeeded, $matches[1] would contain the video ID
一些注意事项:
~
作为分隔符,以避免使用LTS [.]
代替\.
来提高视觉易读性并避免使用LTS。 (“特殊”字符 - 例如点.
- 对字符类没有影响(在方括号内))x
修饰符(具有更多含义;请参阅the docs on Pattern modifiers),这也允许在正则表达式中进行注释(?: <pattern> )
。这使得表达式更有效。或者,要从(或多或少完整的)网址中提取值,您可能需要使用parse_url()
:
$url = 'http://youtube.com/watch?v=VIDEOID';
$parts = parse_url($url);
print_r($parts);
输出:
Array
(
[scheme] => http
[host] => youtube.com
[path] => /watch
[query] => v=VIDEOID
)
验证域名并提取视频ID是留给读者的练习。
我屈服于下面的评论战;感谢Toni Oriol,正则表达式现在也适用于短(youtu.be)URL。
答案 1 :(得分:5)
正则表达式的替代方法是parse_url()
。
$parts = parse_url($url);
if ($parts['host'] == 'youtube.com' && ...) {
// your code
}
虽然代码更多,但它更具可读性,因此更易于维护。
答案 2 :(得分:3)
请尝试:
// Set the youtube URL
$youtube_url = "www.youtube.com/watch?v=vpfzjcCzdtCk";
if (preg_match("/^((http\:\/\/){0,}(www\.){0,}(youtube\.com){1}|(youtu\.be){1}(\/watch\?v\=[^\s]){1})$/", $youtube_url) == 1)
{
echo "Valid";
}
else
{
echo "Invalid";
}
你有||在任何情况下没有^ $都可以。
答案 3 :(得分:3)
这应该这样做:
$valid = preg_match("/^(https?\:\/\/)?(www\.)?(youtube\.com|youtu\.be)\/watch\?v\=\w+$/", $youtube_url);
if ($valid) {
echo "Valid";
} else {
echo "Invalid";
}
答案 4 :(得分:1)
我按照此页面上的其他答案解析网址语法,但对于 YouTube ID 值本身,您可以更具体一点,正如我在下面的答案中所描述的那样的 StackExchange / WebApps的强>:
Format for ID of YouTube video - https://webapps.stackexchange.com/a/101153/141734
视频ID
对于 videoId ,它是一个8字节(64位)整数。将Base64编码应用于8字节数据需要 11个字符。但是,由于每个Base64字符恰好传达6位,因此这种分配实际上可以容纳
11 × 6 = 66
位 - 比我们的有效负载需要的2位过剩。多余的比特被设置为零,这具有排除某些字符出现在编码字符串的最后位置的效果。特别是, videoId 将始终以下列之一结束:{ A, E, I, M, Q, U, Y, c, g, k, o, s, w, 0, 4, 8 }
因此, videoId 的正则表达式(RegEx)如下:
[-_A-Za-z0-9]{10}[AEIMQUYcgkosw048]
频道或播放列表ID
channelId 和 playlistId 字符串由Base64编码128位(16字节)二进制整数生成。同样在这里,每个Base64的计算正确地预测了 22个字符的观察字符串长度。在这种情况下,输出能够编码
22 × 6 = 132
位,4位的剩余;这些零结果限制了大多数64个字母符号出现在最后一个位置,只有4个符合条件。所有 channelId 字符串都以下列之一结尾:{ A, Q, g, w }
这为我们提供了 channelId 的正则表达式:
[-_A-Za-z0-9]{21}[AQgw]