有没有办法验证IPv6网址?
http://[2001:630:181:35::83]/index.php
应该是有效的网址
但PHP的filter_var
函数将返回false
如何添加对IPv6地址的支持?
答案 0 :(得分:0)
我使用FILTER_VALIDATE_URL和FILTER_VALIDATE_IP与FILTER_FLAG_IPV6的组合进行了解决方法。 这是一个免费的正则表达式解决方案:
function validate($url)
{
# 1. We validate the url
if (false === filter_var($url, FILTER_VALIDATE_URL)) {
# 2. Consider the posibility of an IPV6 host
$host = parse_url($url, PHP_URL_HOST);
$ipv6 = trim($host, '[]'); // trim potential enclosing tags for IPV6
# 3. Validate IPV6
if (false === filter_var($ipv6, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
return false;
} else {
# 4. We have a valid IPV6, replace it with a generic host url for further validation purposes
$newUrl = str_replace($host, 'www.someUrl.com', $url);
# 5. We validate the new url
if (false === filter_var($newUrl, FILTER_VALIDATE_URL)) {
return false;
}
}
}
return true;
}
注意:如果url无效,则parse_url()并不总是失败 你不能盲目地替换主机,在验证之前,你可能会错过主机本身的错误。 因此......在更改主机后第二次验证似乎是在IPV6情况下执行此操作的正确方法。