ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
``` /** * 是否为合法的IPv4地址 * @param $ipv4 * @return mixed */ function is_valid_ipv4($ipv4) { return filter_var($ipv4, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4); } /** * 是否为合法的IPv6地址 * @param $ipv6 * @param bool $simplify * @return bool|mixed|string * */ function is_valid_ipv6($ipv6, $simplify=TRUE) { $ipv6 = filter_var($ipv6, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6); if ($simplify and $ipv6){ $tmp = unpack('N*', inet_pton($ipv6)); $ipv6 = inet_ntop(pack('N*', $tmp[1], $tmp[2], $tmp[3], $tmp[4])); // 避免::ffff:1.1.1.1的格式转成1.1.1.1 if (empty($tmp[1]) && empty($tmp[2]) && empty($tmp[3])) { return inet_ntop(pack('N', $tmp[4])); } } return $ipv6; } /** * 判断ip地址是否在某个ip范围内,不适用ipv6 * @param $star_ip:起始ip范围地址 * @param $end_ip:结束ip范围地址 * @param $ip:需要判断的ip地址 * @return bool 是true否false */ function contrast_ip_range($star_ip, $end_ip, $ip) { if ($ip == $star_ip || $ip == $end_ip) { return true; } $star_ip_array = explode('.', $star_ip); $end_ip_array = explode('.', $end_ip); $ip_array = explode('.', $ip); foreach ($star_ip_array as $key => $value) { //起始地址小于等于目标地址且结束地址大于目标地址,则代表在范围内 if ($value <= $ip_array[$key] && $end_ip_array[$key] > $ip_array[$key]) { return true; } elseif ($value > $ip_array[$key] || $end_ip_array[$key] < $ip_array[$key]) { return false; } } return false; } /* * ip地址高位补0 * @param string $ip 192.16.1.12 / 2001:240:1024::125a:2fd * @return string $new_ip 192.016.001.012 / 200102401024000000000000125a02fd * */ function ip_to_full($ip) { // ipv4范围内ipv6转为ipv4 $ip = ip_v6v4to_v4($ip); if (stripos($ip, ':') !== false) { if (stripos($ip, '::') !== false) { $arr = explode('::', $ip); $ip_arr1 = explode(':', $arr[0]); $ip_arr2 = explode(':', $arr[1]); $differ = 8 - count($ip_arr1) - count($ip_arr2); for ($i = 0; $i < $differ; $i++) { $ip_arr1[] = '0000'; } $ip_arr = array_merge($ip_arr1, $ip_arr2); foreach ($ip_arr as &$val) { $val = str_pad($val, 4, '0', STR_PAD_LEFT); } $new_ip = implode('', $ip_arr); } else { $ip_arr = explode(':', $ip); foreach ($ip_arr as &$val) { $val = str_pad($val, 4, '0', STR_PAD_LEFT); } $new_ip = implode('', $ip_arr); } } else { $ip_arr = explode('.', $ip); foreach ($ip_arr as &$val) { $val = str_pad($val, 3, '0', STR_PAD_LEFT); } $new_ip = implode('.', $ip_arr); } return $new_ip; } /* * ip转换为点分十进制或冒分十六进制 * @param string $ip 192.016.001.012 / 200102401024000000000000125a02fd * @return string $new_ip 192.16.1.12 / 2001:240:1024::125a:2fd * */ function convert_ip_express($ip) { if (strlen($ip) == 32) { $ip_arr = []; for ($i = 0; $i < 29; $i = $i + 4) { $ip_arr[] = substr($ip, $i, 4); } //用作判断是否存在0000 $is_zero = false; $arr1 = []; $arr2 = []; foreach ($ip_arr as $val) { if ($val == '0000') { $is_zero = true; continue; } //去掉前导0 $val = ltrim($val, '0'); if ($is_zero == false) { $arr1[] = $val; } else { $arr2[] = $val; } } if (empty($arr2)) { $new_ip = implode(':', $arr1); } else { $new_ip = implode(':', $arr1) . '::' . implode(':', $arr2); } } else { $ip_arr = explode('.', $ip); foreach ($ip_arr as &$val) { //去掉前导0 $val = ltrim($val, '0'); $val = empty($val) ? "0" : $val; } $new_ip = implode('.', $ip_arr); } return $new_ip; } ```