目前有如下几种格式的IP,均需要转换为IP范围的格式。
例如:192.168.1.*转为192.168.1.0-192.168.1.255
待转换的格式有如下几种:
1.单IP
2.A.B.C.*
3.A.B.C.D-E
4.A.B.C-D.*
5.A.B.C.D/E
转换的代码如下:
<?php
function transIpsToRange($ips=array()){
if(is_array($ips)&&count($ips)>0){
for($i=0;$i<count($ips);$i++){
$ips[$i] = transIpToRange($ips[$i]);
}
}
return $ips;
}
function transIpToRange($ip){
$param = '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])';
$singleIpReg = "/^$param\.$param\.$param\.$param$/";
$starIpReg = "/^$param\.$param\.$param\.[\*]/";
$ip3Reg1 = "/^$param\.$param\.$param$/";
$ip3Reg2 = "/^$param\.\*/";
$numReg = "/^([1-9]|[1-2][0-9]|3[0-2])$/";
$tag = true;
if(preg_match($singleIpReg, $ip)){
$ip = $ip;
}elseif(preg_match($starIpReg, $ip)){
$startIp = substr($ip,0,strrpos($ip,'.')).'.0';
$endIp = substr($ip,0,strrpos($ip,'.')).'.255';
$ip = $startIp.'-'.$endIp;
}else if(strpos($ip,'-')!==false){
$substrs = explode('-',$ip);
if(preg_match($singleIpReg,$substrs[0])&&preg_match("/^$param$/", $substrs[1])){
$ips = explode('-',$ip);
$startIp = $ips[0];
$endIp = substr($startIp,0,strrpos($startIp,'.')).'.'.$ips[1];
$ip = $startIp.'-'.$endIp;
}else if(preg_match($ip3Reg1,$substrs[0])&&preg_match($ip3Reg2, $substrs[1])){
$ips = explode('-',$ip);
$startIp = $ips[0].'.0';
$ips1 = explode('.',$ips[1]);
$endIp = substr($ips[0],0,strrpos($ips[0],'.')).'.'.$ips1[0].'.255';
$ip = $startIp.'-'.$endIp;
}else{
$tag = false;
}
}else if(strpos($ip,'/')!==false){
$substrs = explode('/',$ip);
if(preg_match($singleIpReg,$substrs[0])&&preg_match($numReg,$substrs[1])){
$num = (int)$substrs[1];
$nums1 = explode('.',$substrs[0]);
$startIps = array();
$endIps = array();
for($i=0;$i<count($nums1);$i++){
$nums1[$i] = decbin((int)$nums1[$i]);
if(strlen($nums1[$i])<8){
for($j=strlen($nums1[$i]);$j<8;$j++){
$nums1[$i] = '0'.$nums1[$i];
}
}
if($num>=8){
$startIps[] = $nums1[$i];
$endIps[] = $nums1[$i];
}else if($num>=0){
$startIps[] = substr($nums1[$i],0,$num);
$endIps[] = substr($nums1[$i],0,$num);
for($j=$num;$j<8;$j++){
$startIps[$i] .= '0';
$endIps[$i] .= '1';
}
}else{
$startIps[] = '00000000';
$endIps[] = '11111111';
}
$startIps[$i] = bindec($startIps[$i]);
$endIps[$i] = bindec($endIps[$i]);
$num -= 8;
}
$ip = implode('.',$startIps).'-'.implode('.',$endIps);
}else{
$tag = false;
}
}else{
$tag = false;
}
if(!$tag){
return 'invalid ip';
}else{
return $ip;
}
}
//test
print_r(transIpsToRange(array('10.67.1.1','10.67.1.*','10.67.1.1-22','10.67.1-3.*','10.64.1.1/15')));
?>
转换的结果为: