filter_var函数与IPv6 URL

时间:2014-08-15 09:49:46

标签: php regex ipv6

有没有办法验证IPv6网址?

http://[2001:630:181:35::83]/index.php应该是有效的网址

但PHP的filter_var函数将返回false

如何添加对IPv6地址的支持?

1 个答案:

答案 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情况下执行此操作的正确方法。