可以支持段号和星号,支持白名单,黑名单
class IpHelper{ /** * IP验证 * * 如果地址在黑名单中,返回false; * 如果地址不在黑名单但在白名单中,返回true; * 如果地址既不在黑名单也不在白名单,视是否是严格模式而定, * 如果是严格模式,则当IP不在黑白名单时返回false;反之,返回true * * @param string $ip 访问IP * @param array $valid_list 白名单 * @param array $invalid_list 黑名单 * @param boolean $is_strict 是否严格模式 * @return boolean */ public static function checkIP($ip, $valid_list, $invalid_list=array(), $is_strict=true) { $ip_segs = explode('.', $ip); // 先黑后白 if (!empty($invalid_list)) { return self::isInSection($ip_segs, $invalid_list) ? false : true; } if (!empty($valid_list)) { return self::isInSection($ip_segs, $valid_list); } return $is_strict == true ? false : true; } /** * 判断某个IP是否在某个网段内 * * @param array $ip_segs IP分段数组 * @param array $section_list 指定IP或IP段列表 * @return boolean */ public static function isInSection($ip_segs, $ip_list) { foreach ($ip_list as $key => $val) { $ip_str = self::formatIp($val); if (!empty($ip_str)) { $segments = explode('.', $ip_str); if (self::isValidSegment($ip_segs, $segments)) { return true; } } } return false; } /** * 格式化IP * * @param string $ip IP段或IP地址 * @return mixed */ public static function formatIp($ip) { $arr = explode('.', $ip); $repeat_count = 4 - count($arr); if ($repeat_count < 0) { return false; } $ip .= str_repeat('.*', $repeat_count);// 追加成完整格式 return str_replace('*', '0-255', $ip);// 把星号转换成标准段 } /** * 验证IP是否在合法范围中 * * 依次比较每个IP进行判断,如果全都符合,返回true,有任何不符,返回false * * @param array $ip_segs IP分段数组 * @param array $segments 指定IP或IP段分段数组 * @return boolean */ public static function isValidSegment($ip_segs, $segments) { foreach ($segments as $key => $val) { if (strstr($val, '-') !== false) { $range = explode('-', $val); if ($ip_segs[$key] < (int)$range[0] || $ip_segs[$key] > (int)$range[1]) { return false; } } else { if ((string)$ip_segs[$key] != trim($val)) { return false; } } } return true; }}
测试:
$ip1 = "10.237.1.100";$ip2 = "10.237.3.100";$valid_list = array("10.237.1-2.*");$invalid_list = array("10.237.1.100");$rs1 = IpHelper::checkIP($ip1, $valid_list);$rs2 = IpHelper::checkIP($ip2, $valid_list);$rs3 = IpHelper::checkIP($ip1, $valid_list, $invalid_list);var_dump($rs1);var_dump($rs2);var_dump($rs3);
输出结果:
boolean trueboolean falseboolean false