本文主要是介绍检测ip地址库内是否存在指定的ip,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
检测ip地址库内是否存在指定的ip,支持精确匹配、尾部*号匹配及ip区间匹配。
应用场景:ip 白名单 / 黑名单、系统后台限制内网访问等。
/*** 检测ip地址库内是否存在指定的ip,支持精确匹配、尾部*号匹配及ip区间匹配* @param string $ip 待检测的ip字符串* @param array $ipList ip数组列表,该参数为空时,忽略检测* @return bool true 地址库为空 或 地址库内存在指定的ip | false 地址库内不存在指定的ip*/public function filterIP($ip,$ipList=array()) {if (!$ipList) {return true;}// 优先精确匹配if (in_array($ip,$ipList)) {return true;}$ip_tmp = explode('.',$ip);$ip_tmp_pad = $ip_tmp;array_walk($ip_tmp_pad,function(&$value,$key){$value = str_pad(strval($value), 3, '0', STR_PAD_LEFT);});$ip_tmp_long = implode('',$ip_tmp_pad);// ip段区间匹配foreach ($ipList as $ipItem) {if (strpos($ipItem,'-') === false) {continue;}$ip_item_tmp = explode('-',$ipItem);// 起始ip$ip_start = trim($ip_item_tmp[0]);$ip_start_arr = explode('.',$ip_start);array_walk($ip_start_arr,function(&$value,$key){$value = str_pad(strval($value), 3, '0', STR_PAD_LEFT);});$ip_start = implode('',$ip_start_arr);// 截止ip$ip_end = trim($ip_item_tmp[1]);$ip_end_arr = explode('.',$ip_end);array_walk($ip_end_arr,function(&$value,$key){$value = str_pad(strval($value), 3, '0', STR_PAD_LEFT);});$ip_end = implode('',$ip_end_arr);if ($ip_tmp_long >= $ip_start && $ip_tmp_long <= $ip_end) {return true;}}// 模糊匹配处理$flag = false;foreach ($ipList as $ipItem) {$ip_item_tmp = explode('.',$ipItem);if ($ip_item_tmp[0] == '*') {$flag = true;break;}// ip第1段if ($ip_item_tmp[0] == $ip_tmp[0] && $ip_item_tmp[1] == '*') {$flag = true;break;}// ip第2段if ($ip_item_tmp[0] == $ip_tmp[0] && $ip_item_tmp[1] == $ip_tmp[1] && $ip_item_tmp[2] == '*') {$flag = true;break;}// ip第3段if ($ip_item_tmp[0] == $ip_tmp[0] && $ip_item_tmp[1] == $ip_tmp[1] && $ip_item_tmp[2] == $ip_tmp[2] && $ip_item_tmp[3] == '*') {$flag = true;break;}// ip第4段if ($ip_item_tmp[0] == $ip_tmp[0] && $ip_item_tmp[1] == $ip_tmp[1] && $ip_item_tmp[2] == $ip_tmp[2] && $ip_item_tmp[3] == $ip_tmp[3]) {$flag = true;break;}}return $flag;}
这篇关于检测ip地址库内是否存在指定的ip的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!