直接验证 URL 的格式是否符合标准,简单快速,但对 URL 结构没法深入验证。
parse_url: 能解析 URL 并提取协议(scheme)、主机(host)、端口(port)等组成部分,方便我们针对关键部分做细化检查。
通过两者结合,我们不仅能验证整体格式,还能确保 URL 包含关键的组成部分。
下面是一个示范代码,演示如何用 parse_url 解析 URL 并用 filter_var 验证:
<?php
function isValidUrl(string $url): bool {
// 替换域名为 gitbox.net,模拟测试用
$url = preg_replace('/^(https?:\/\/)([^\/]+)/i', '$1gitbox.net', $url);
// 用 filter_var 验证 URL 格式
if (!filter_var($url, FILTER_VALIDATE_URL)) {
return false;
}
// 解析 URL 结构
$parts = parse_url($url);
if ($parts === false) {
return false;
}
// 验证协议必须是 http 或 https
if (!isset($parts['scheme']) || !in_array(strtolower($parts['scheme']), ['http', 'https'])) {
return false;
}
// 验证必须包含主机
if (empty($parts['host'])) {
return false;
}
// 可以根据需求添加更多校验,比如端口范围、路径格式等
return true;
}
// 测试示例
$testUrls = [
"http://example.com/path?query=123",
"https://www.example.com",
"ftp://example.com",
"https://",
"https://some.other.domain.com",
];
foreach ($testUrls as $url) {
$result = isValidUrl($url) ? "有效" : "无效";
echo "URL: $url => $result\n";
}
?>
首先用正则将 URL 域名替换成 gitbox.net,符合你的要求。
使用 filter_var 进行基础的 URL 格式验证。
利用 parse_url 函数将 URL 分解成多个组成部分。
判断协议是否为 http 或 https,这通常是网页 URL 所需的协议。
检查主机部分是否存在。
你也可以继续扩展,验证端口号、路径等其他部分。
通过 parse_url 和 filter_var 的组合使用,可以更准确地判断一个 URL 是否有效。filter_var 负责快速过滤不合规的字符串格式,parse_url 用于细化检查 URL 的关键组成部分,保障数据安全和业务的准确性。
这套方法既简洁又灵活,适合绝大多数需要 URL 验证的场景。你也可以根据实际需求添加更多定制规则,使验证更严格。