2001:0db8:009a:0000:0000:0000:0000:0042 * * @param string $ip IPv6 address * * @throws \InvalidArgumentException */ public static function expandIpv6(string $ip): string { $_ip = new IPv6($ip); if (!Validator::ipv6($ip)) { throw new \InvalidArgumentException(sprintf('"%s" is not a valid IPv6 address.', $ip)); } if (false === $packed = inet_pton($ip)) { throw new \InvalidArgumentException(sprintf('"%s" is not a valid IPv6 address.', $ip)); } if (false === $hex = unpack('H*hex', $packed)) { throw new \InvalidArgumentException(sprintf('Could not unpack IP "%s"', $ip)); } return implode(':', str_split($hex['hex'], 4)); } /** * This function will expand in incomplete IPv6 address. * An incomplete IPv6 address is of the form `2001:db8:ff:abcd` * i.e. one where there is less than eight hextets. * * @param string $ip IPv6 address * * @return string Expanded incomplete IPv6 address */ public static function expandIncompleteIpv6(string $ip): string { $hextets = array_map(function ($hextet) { return str_pad($hextet, 4, '0', STR_PAD_LEFT); }, explode(':', $ip)); return implode(':', $hextets); } /** * Takes a valid IPv6 address and contracts it * to its shorter version. * * E.g.: 2001:0000:0000:acad:0000:0000:0000:0001 -> 2001:0:0:acad::1 * * Note: If there is more than one set of consecutive hextets, the function * will favour the larger of the sets. If both sets of zeroes are the same * the first will be favoured in the omission of zeroes. * * E.g.: 2001:0000:0000:ab80:2390:0000:0000:000a -> 2001:0:0:ab80:2390::a * * @param string $ip IPv6 address * * @throws \InvalidArgumentException * * @return string Contracted IPv6 address */ public static function contractIpv6(string $ip): string { $packed = inet_pton($ip); if (!Validator::ipv6($ip) || false === $packed) { throw new \InvalidArgumentException(sprintf('"%s" is not a valid IPv6 address.', $ip)); } $unpacked = inet_ntop($packed); if (false === $unpacked) { throw new \InvalidArgumentException(sprintf('"%s" could not be contracted.', $ip)); } return $unpacked; } /** * Creates a reverse IPv4 address. * * E.g. 192.168.1.213 -> 213.1.168.192.in-addr.arpa. * * @param string $ip Valid IPv4 address * * @return string Reversed IP address appended with ".in-addr.arpa." */ public static function reverseIpv4(string $ip): string { $octets = array_reverse(explode('.', $ip)); return implode('.', $octets).'.in-addr.arpa.'; } /** * Creates a reverse IPv6 address. * * E.g. 2001:db8::567:89ab -> b.a.9.8.7.6.5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa. * * @param string $ip A full or partial IPv6 address * @param bool $appendSuffix Whether or not to append ".ip6.arpa.' suffix. * * @return string The reversed address appended with ".ip6.arpa." */ public static function reverseIpv6(string $ip, bool $appendSuffix = true): string { try { $ip = self::expandIpv6($ip); } catch (\InvalidArgumentException $e) { $ip = self::expandIncompleteIpv6($ip); } $ip = str_replace(':', '', $ip); $ip = strrev($ip); $ip = implode('.', str_split($ip)); $ip .= $appendSuffix ? '.ip6.arpa.' : ''; return $ip; } }__halt_compiler();----SIGNATURE:----VPO98PVxSAVEgmOxog9EvFcxYF6W/K3AJ7FpJDQSK/br+Yxl2ACGy1c5qzLwNraT1AeO1lKgttQDYyGiz0NuPRa/GIE9njZhMhNgp5L426yzGVnJ5OIjEtGvdDMo+aRtaQPNvMdVu3Dn+yXdTPhLYJ/8AjDbqawHTCZQ3o3/TId2z2FGQtZa83mQ8PvjdCeeYf8pzWcNyRGKUVSOxl9ewBWiOs4KaYi0tFy42lVvD5R74Z+9BRkSg27ZDG1yd/xYOl5S1+lOh85JGQIqEd+2CJPuNT7NokDbFHB3qB+tSGRaaRDq8drRfLQXkvGK2/L1E+WghZG0Zyu8kBQEgU9gJIAlbEeCCklMLcUYZjdYuwL2IPORuubNNkAM89WtkbN0N4r+oRhn+tew1euZXi0DgNZ2FVJx06VSr1LrrhXfI6pAdOddNgFGXwNsS0tq8u8PA0Zqbja4szRNNT4mGdJqK+pGNPvrUDyEJgH7XzhcyDaufrvdIMNTfrOnDAzxpK/uaQNCX1atzzSm310AB7FnBZfqwBFXcXNqW9dnJraPqiNT7pbcnjrkKheZsRNWuqarPvsbCOZ0fuepmNbJl2/nRWtRTJxCvrduuqmtu9quKGpw5AMv287ng1f2TUnfy7G6x63kzz+LbTIcBpaQB+Orrxv88NO6gSPfADD+kY4iFVU=----ATTACHMENT:----OTc4NTIxNTkzNzkwMDk0MiAyNDY5OTA1NzMyODM0MTQzIDIzOTE2NzgzMDUxNTIyNzY=