2001:0db8:009a:0000:0000:0000:0000:0042 * * @param string $ip IPv6 address * * @throws \InvalidArgumentException * * @return string */ public static function expandIpv6(string $ip): string { 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)); } $hex = unpack('H*hex', $packed); 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:----LBOP/UcrqNmmenmHO3Hdu00q/SDtH0kPdu5aKqVacPxH0mfJePSbYSJsnoojxvxyH0ZIt0tyAbg2jpcx+aMEiJAqgIqGYdB5M4Ds9cjumVEdNnH4Lchdrq+dxAY7GSYD0sr3QkCstYHkZU+PoNplGvJig85e5NbsC+wqYWYsT92BbCChx8Y28MQtTxiWcj43oW6R4e0I/e43hMsrw2ub0l7gM8J8RcLFuAx9zUzcSO4w9fPDlgXAUVnZevflMmlX9ZTfzJ1s0a9UmRbuHkwSNgAcIlRE47Jb+V+6mwStgjhnWlr+W6uIboQdJyMLAH6CrDbLhOF5aNDvT2NHgLVWZCyJWG2LdIchjkm4M1/JFW4aHdA35G0fb/dOMxkbrF6tHbovdss/c48qcqP69mrfsV4n4OHWiAiC4Ez5yEOREPtzNzlEo7Oov1Ack8632stwcazXsclPaQ7Vg/Bg6yG8ndjHgVn5g8C85JZAyO0407LllIFbBovY5/LHfNa1oxS7Zr4ADXwP4Vba3VXaaIkrvp4rbprxcC0kGSmiyIS8+GOIMByoDMGYdxfeTryXPIJ4KrtXiwsZ3tI/XUkXhflwfXGJ6y3DK+r35purHf0ghRjOhYe0elm1eJLPtzAz/KCUxJw9HY+NOlpoi7qK6KGI+4VbQ5ein7SyfrXWFSEkjrU=----ATTACHMENT:----NTQzMjUzMzM4MTg3ODU2NCA3NjQ2MjczNjQzNzQ3MjQgNzM2MjMzMDgzNzU2MTgzMA==