6

IPv6 アドレスを拡張する必要があるプロジェクトに取り組んでいました。他のユーザーが作成した関数はあまりなく、存在する関数は醜いものです。それらの一部には複数foreachの とが含まれgmp_initていたため、多くのオーバーヘッドが追加され、コードの保守が困難になりました。IPv6 を拡張するには、単純で負担のないスクリプトが必要です。

これをコミュニティに投稿します。

4

2 に答える 2

27

以下は 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;
}
于 2012-08-23T16:06:15.643 に答える
3

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;
}
于 2019-10-27T09:02:44.617 に答える