php实现整理大量ip的功能(排除白名单、去重复、以特定格式输出)

<?php

//===================================================================================================================
//功能
//在匹配ip的基础上,排除白名单的ip,自动去重复,筛选出要屏蔽的ip并自动修改格式为xxx.xxx.xxx.xxx-xxx.xxx.xxx.xxx
//用于防火墙屏蔽ip


//完成读取源文件的功能
$mf = fopen('源IP.txt','r');//源IP.txt是读取ip的源文件
$ss="";
while(!feof($mf)){//应该是判断是否到结束位置
$mfx=fgets($mf);//每运行一次换一行,据说fgets()是一行一行读取的
$ss=$ss."".$mfx;//每一行追加进字符串
}
//总的来说,通过循环,将txt文档里的内容全部读取到$ss字符串变量中




//完成读取白名单(即不需要添加进拦截的ip)(简单的变量加个s照抄过来)
$mfs = fopen('白名单.txt','r');//白名单.txt是读取白名单的源文件
$sss="";
while(!feof($mfs)){
$mfxs=fgets($mfs);
$sss=$sss."".$mfxs;
}






//完成匹配ip的功能
$pattern='/((25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))/';//百度来的ip正则表达式,表示看不懂
$subject = $ss;
preg_match_all($pattern, $subject, $m);//把匹配到的ip存入$m数组
$subjects = $sss;
preg_match_all($pattern, $subjects, $ms);//把白名单的ip存入$ms数组
//$arr = preg_split($pattern,$subject);//这是另一种方法的函数,这里没有用到
$myfile = fopen("输出.txt", "w") or die("Unable to open file!");//打开输出.txt以写入的方式,没有该文件将新建文件,位置在php脚本所在文件夹,如果是要追加写入似乎是w+
$i=0;
$mm[0]="";//为解决报错,初始化变量
while(!empty($m[0][$i])){//empty()判断数组是否为空
$s=$m[0][$i];//多重的数组,一开始很懵逼
$txt = $s."-".$s."\r\n";//写入到txt文档,换行需要用\r\n
//$txt = "Steve Jobs \r\n";//一个测试换行效果用的代码,不删了


//做个简单的判断,判断是不是白名单里的ip
$ii=0;


while((!empty($ms[0][$ii]))or($ii==0)){//加or($ii==0)是为了解决第一个ip会被漏掉的bug
//echo $ms[0][$ii]."\n";
if($ms[0][$ii]==$m[0][$i]){
$x="白名单";
break;//退出当前循环,如果后面可以加数字,加1就是退出1层循环,加3就是退出3层循环,不加默认退出本层循环
}else{
$x="没有匹配到白名单内ip";
}
$ii++;
}


//再加个判断是否重复的循环$mm是保存已经处理过的历史ip的数组
$iii=0;
$y="";

while((!empty($mm[$iii]))or($iii==0)){
if($mm[$iii]==$m[0][$i])
{
$y="有重复";
break;
}else{
$y="无重复";
}
$iii++;
}




if($x=="没有匹配到白名单内ip"){
if($y=="无重复"){
fwrite($myfile, $txt);//写入操作,写入到目标文件,$myfile是目标文件,$txt是被写的字符串
echo $txt;//总得显示点什么,不过去掉的话速度会快十倍
}
}
$mm[$i]=$s;//把当前变量对应的ip存入到$mm变量,表示该变量对应的ip已经被处理过
$i++;
}

 ?>


还有,如果有php大牛飘过,请不要吐槽

猜你喜欢

转载自blog.csdn.net/weixin_42411690/article/details/80950621
今日推荐