将任意格式的IP转为IP范围

本文介绍了一种PHP脚本方法,用于将不同格式的IP地址转换为IP范围格式。包括单个IP、通配符IP、斜杠表示法等,并提供了详细的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目前有如下几种格式的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')));
?>

转换的结果为:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值