IPv6 アドレスを拡張する必要があるプロジェクトに取り組んでいました。他のユーザーが作成した関数はあまりなく、存在する関数は醜いものです。それらの一部には複数foreach
の とが含まれgmp_init
ていたため、多くのオーバーヘッドが追加され、コードの保守が困難になりました。IPv6 を拡張するには、単純で負担のないスクリプトが必要です。
これをコミュニティに投稿します。
以下は 2 つのライナーです。ここ$ip
で、 は圧縮された IPv6 アドレスです。展開された を返します$ip
。
例:
$ip = "fe80:01::af0";
echo expand($ip); // fe80:0001:0000:0000:0000:0000:0000:0af0
機能:
function expand($ip){
$hex = unpack("H*hex", inet_pton($ip));
$ip = substr(preg_replace("/([A-f0-9]{4})/", "$1:", $hex['hex']), 0, -1);
return $ip;
}
Mike Mackintosh と Yann Milin の助けを借りて、この関数を思いつきました。
function expandIPv6($ip) {
$hex = bin2hex(inet_pton($ip));
return implode(':', str_split($hex, 4));
}
より普遍的な機能の下では、魔女は IPv4 にマッピングされた IPv6 アドレスからも IPv4 を抽出します。
function expandIPv6($ip) {
if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4))
return $ip;
elseif (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
$hex = bin2hex(inet_pton($ip));
if (substr($hex, 0, 24) == '00000000000000000000ffff') // IPv4-mapped IPv6 addresses
return long2ip(hexdec(substr($hex, -8)));
return implode(':', str_split($hex, 4));
}
return false;
}