我一直在阅读有关如何确定IP是IPv4还是IPv6的问题,而且对我而言,显而易见的是,是否存在冒号。但是,您具有IPv4映射的IPv6地址和IPv4兼容的IPv6地址。在我看来,这些类型的地址都有冒号和句点,所以不是寻找字符串开头是否没有::ffff
的解决方案,为什么不这样做呢?
function isIPv6($ip) {
if(strpos($ip, ":") !== false && strpos($ip, ".") === false) {
return true;
}
return false;
}
编辑:我错过了什么或者这个功能在所有情况下都能正常工作吗?
答案 0 :(得分:5)
PHP => 5.2使用filter_var
进行“内置”方法您的功能可能如下所示:
function isIPv6($ip) {
if(filter_var($ip, FILTER_VALIDATE_IP)) {
if(filter_var($ip, FILTER_FLAG_IPV6)) {
//It is IPv6 indeed.
} else {
//It is IPv4
}
} else {
// NOT VALID IP
}
}
答案 1 :(得分:3)
来自IBM:
An IPv6 address can have two formats: Normal - Pure IPv6 format 2001 : db8: 3333 : 4444 : 5555 : 6666 : 7777 : 8888 Dual - IPv6 plus IPv4 formats 2001 : db8: 3333 : 4444 : 5555 : 6666 : 1 . 2 . 3 . 4
您只能验证IPv6的纯格式。 我还建议使用FILTER_FLAG_IPV4 or FILTER_FLAG_IPV6
function isIPv6($ip) {
if(strpos($ip, ":") !== false && strpos($ip, ".") === false) {
return true; //Pure format
}
elseif(strpos($ip, ":") !== false && strpos($ip, ".") !== false){
return true; //dual format
}
else{
return false;
}
}
答案 2 :(得分:1)
假设IP地址有效并且知道您可以拥有IPv6映射的IPv4地址,例如::ffff:127.0.0.1
,只需检查:
的存在就足够了。
function isIPv6($address)
{
return strpos($address, ':') !== false;
}
如果它可能无效,您应该先验证它:
function isIPv6($address)
{
return filter_var($address, FILTER_VALIDATE_IP) &&
strpos($address, ':') !== false;
}
顺便说一下,这也是PHP处理IPv6的方式,你可以从the source看到。