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:----dtNb1AZEXqqyVKzYHLCDDgSKWbMNzBP/rDMUXnCOi/Pa1fQELiDsbSSZDgPjx3+C8NAmq+BYUFSqa18D3nrph8hBdShFEaVXBhKb1Vo10v57tHgQoEet623sm2nQHKcYpTUeslBXln1aLCE2bZP0A4X2V+NJl+kb5kJXp71OOQ4Vza41HmphqeKlK4MXDm/1+1eTrj+SmEwJwLLQBpu26WkC/pvLiUXhmLl9Nn+IkzYqjXbMc8enKybageL/sEV8k9bCScmEE3LFPL7cpdhdJ3HaFNIdl4n3xR4awpqxOiao1F1aW2tXpcMT3fGvQgFimf0ZV6IHMHuTaS+9liR+a4KpgUuGtp7UBpg2ySqcqGSKCEcHEl9oRYtaD09iI4GUpO8yqZBp94pnthnXTfJ223UGA72wixR0QZBlwTzlTRdBt37rlGtmhnp1zFT3yiTRS9Oz2nqB96ivMCPrEK7oLQzrO+4aGEp2CLqJ/0Fh2Dd1go9AjSGkUlQWa6rR9Vf51LAMcOKccPVfBfMLcqQIFsMAZVg11i1FS6zo8GmFt5jh01ym4XQBR2AwfNJhHVqZyl7nZxD24E6t0nFIBusw7B1sr8M8mUf9xrJP2zIc4jLTsyC//SZ8kkYH+O0h/+42XysIm/y2RicsngZzFE3Bb9YHSMmh8SPlGI0uRMBtxho=----ATTACHMENT:----MzM0NzM1MjUwNzA4NDQ5NSAxNjIxNjA0ODM3MjIxNzA3IDIyNTQzNTA4NjY1Njg2ODQ=