我正在尝试为我的应用程序验证 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 网址的以下变体:
- 有和没有 http://
- 有无 www.
- 使用 URL youtube.com 和 youtu.be
- 必须有/watch?v=
- 必须有唯一的视频字符串(在上面的例子中“vpfzjcCzdtCk”)
但是,我认为我的逻辑不正确,因为出于某种原因它返回 true for: www.youtube.co/watch?v=vpfzjcCzdtCk
(注意我用 .co
而不是 .com
写错了)
最佳答案
您的这个正则表达式(以及 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> )
.这使表达式更有效。
可选地,要从(或多或少完整的)URL 中提取值,您可能需要使用 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。
关于php - 使用正则表达式验证 Youtube URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13476060/