这里和其他地方有很多关于如何在PHP中处理IP4和IP6地址的帖子。
我想写一段代码,将所有IP地址规范化为IP6格式,无论其表示形式如何。
我可以通过拼凑各种建议和进行一些字符串破解来做到这一点,但的最佳实践是否已经从开始了?
现代PHP中是否有内置函数可以在所有情况下都正确执行此操作,在我的应用程序代码中没有任何条件逻辑?
不,没有任何条件逻辑都无法做到这一点。另一方面,必要的代码并不难:
function normalise_ip($address, $force_ipv6=false) {
# Parse textual representation
$binary = inet_pton($address);
if ($binary === false) {
return false;
}
# Convert back to a normalised string
$normalised = inet_ntop($binary);
# Add IPv4-Mapped IPv6 Address prefix if requested
if ($force_ipv6 && strlen($binary) == 4) {
$normalised = '::ffff:' . $normalised;
}
return $normalised;
}
你可以这样测试:
$addresses = array(
'192.000.002.001',
'2001:0db8:0000:0000:0000:0000:0000:0001',
);
foreach ($addresses as $original) {
$normalised = normalise_ip($original);
$normalised_ipv6 = normalise_ip($original, true);
echo "Original: $original; ";
echo "Normalised: $normalised; ";
echo "As IPv6: $normalised_ipv6'n";
}
如果强制结果为IPv6,则会得到IPv4映射的IPv6地址,而不是IPv4地址。