这里给大家详细讲解一下一个匹配IP地址的正则表达式,

有关正则方面的知识,会在详细的讲解中提到。
在讲解之前,我先给大家介绍一下,ip地址的生成规则。
IP地址,是由32位数字二进制转为四个十进制的字符串组成。
怎么转化?下面讲解:
二进制:11111111111111111111111111111111
分为四部分:11111111.11111111.11111111.11111111
转化:2^7+2^6+2^5+2^4+2^3+2^2+2^1+2^0=255
转为十进制范围:0~255.0~255.0~255.0~255
这就是IP地址的范围。
根据这个生成IP的规则和范围,我们可以用正则表达式来匹配出IP地址,但怎么匹配呢?各人有各人的方法,这里我讲解一下我的思路。
根据IP地址的字符串规律,我把匹配IP地址的表达式分为两部分来考虑。
第一部分:匹配3个0~255.(注意后面的一个点)
第二部分:匹配最后的数字0~255
也就是说,先匹配出 0~255.(注意后面的一个点) 这个字符串,然后重复匹配3次,然后再匹配最后的数字部分0~255。这就是我匹配IP地址的思路。
首先,我要提一下,正则是没有办法做数字运算的,所以,我们无法用数字运算的方式筛选出IP的数字范围。既然没法用数字运算的方式筛选出IP的数字范围,那么我们应该用什么其他方式来筛选这个数字范围呢?我的思路是分组讨论,然后再把这些分组合并起来组成IP的数字范围。
①、假设IP的数字是百位数,那么根据IP的数字范围,我们可以得出下面几种情况。假设第一个数字为1,那么这个数字的范围就为1[0-9][0-9]。这个应该不难理解,就不解释。
②、假设第一个数字为2,那么根据IP数字的范围规则,这里又要分为两种情况,为什么?你想想,最大数字是255,当十位数为5时,个位数最大只能为5是吧?而当十位数为0到4时,个位数可以是任意数字对吧?
所以,这里的两种情况分别为:
A、2[0-4][0-9]
B、25[0-5]
③、分析完了百位数的情况,接下来就是十位数的情况了,假如是十位数,那么十位数的前面第一个数不能为零是吧?
所以十位数的情况可以是:[1-9][0-9]
④、剩下的就是个位数的情况了,个位数的情况,大家应该很容易得出结论,就是:[0-9]。
四种情况分析下来,我们得出了IP数字的范围分组为:
1[0-9][0-9]
2[0-4][0-9]
25[0-5]
[1-9][0-9]
[0-9]
怎么把上面的分组用正则表达式表示出来呢?很简单,用正则的或符号|和分组符号()就可以了,所以上面的分组正则表达式为:
(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])|([1-9][0-9])|([0-9])
写到这里,数字的匹配范围正则表达式已经写好了,那么根据我前面的思路: 第一部分:匹配3个0~255.(注意后面的一个点)
第二部分:匹配最后的数字0~255
我们来匹配IP地址的第一部分,正则表达式如下:
(1[0-9][0-9]\.)|(2[0-4][0-9]\.)|(25[0-5]\.)|([1-9][0-9]\.)|([0-9]\.)
我在每个数字的后面加了一个点就是匹配出0~255.(注意后面的一个点)
那么怎么重复匹配三次呢?很简单,我们只要把这五个分组当成整体,再重复匹配三次就行了,正则表达式如下:
((1[0-9][0-9]\.)|(2[0-4][0-9]\.)|(25[0-5]\.)|([1-9][0-9]\.)|([0-9])\.)){3}
第一部分已经匹配出来了,接下来就是拼接上第二部分的数字了,数字部分上面已经写得很清楚了,就不再解释了,下面是完整的正则表达式:
((1[0-9][0-9]\.)|(2[0-4][0-9]\.)|(25[0-5]\.)|([1-9][0-9]\.)|([0-9]\.)){3}((1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])|([1-9][0-9])|([0-9]))
写到这里,正则匹配IP的表达式已经出来了,不过,这并不是最终的匹配IP的正则表达式,为什么呢?很简单,正则表达式会对每一个分组都进行捕获匹配,上面把匹配IP分成了那么多分组,而每一个分组的内容都会被正则所捕获,那上面不知道已经捕获多少IP了,呵呵,那么怎么去掉分组的内容呢?很简单,用这个符号?:
?:符号放在()圆括号里面,是捕获分组,但不捕获正则表达式的内容的意思。那么,我们把它放到每一个分组里面去,不就去掉了分组的内容了吗?所以,我们还要给每个分组加上?:,加上后正则如下:
(?:(?:1[0-9][0-9]\.)|(?:2[0-4][0-9]\.)|(?:25[0-5]\.)|(?:[1-9][0-9]\.)|(?:[0-9]\.)){3}(?:(?:1[0-9][0-9])|(?:2[0-4][0-9])|(?:25[0-5])|(?:[1-9][0-9])|(?:[0-9]))
即使到这里,还是没有把IP地址匹配出来,我们还要用^和$来限制字符串的开头和结尾,所以,最后的匹配IP地址的正则表达式是:
^(?:(?:1[0-9][0-9]\.)|(?:2[0-4][0-9]\.)|(?:25[0-5]\.)|(?:[1-9][0-9]\.)|(?:[0-9]\.)){3}(?:(?:1[0-9][0-9])|(?:2[0-4][0-9])|(?:25[0-5])|(?:[1-9][0-9])|(?:[0-9]))$
这就是我匹配IP地址最完整的正则表达式,大家可以借鉴一下,有什么bug还望读者提出,免得误导其他读者。
上面的正则表达式的()括号都是成对出现的,假如有不成对出现,请读者自己添加一下,可能是我漏写了。
下面是我的测试:
<?php
$pattern = '/^(?:(?:2[0-4][0-9]\.)|(?:25[0-5]\.)|(?:1[0-9][0-9]\.)|(?:[1-9][0-9]\.)|(?:[0-9]\.)){3}(?:(?:2[0-5][0-5])|(?:25[0-5])|(?:1[0-9][0-9])|(?:[1-9][0-9])|(?:[0-9]))$/';
//正则匹配ip地址
$ip = '254.21.0.198';
preg_match($pattern,$ip,$out);
echo '<pre>';
print_r($out);
$ip = '255.777.0.198';
preg_match($pattern,$ip,$out);
print_r($out);
$ip = '07.25.8.198';
preg_match($pattern,$ip,$out);
print_r($out);
$ip = '1207.25.8.198';
preg_match($pattern,$ip,$out);
print_r($out);
$ip = 'qq107.25.8.198';
preg_match($pattern,$ip,$out);
print_r($out);
$ip = '\.\.\.107.25.8.198';
preg_match($pattern,$ip,$out);
print_r($out);
$ip = '\.\.\. 7.25.8.198';
preg_match($pattern,$ip,$out);
print_r($out);
$ip = '107.25.8.19822vvv';
preg_match($pattern,$ip,$out);
print_r($out);
$ip = '107.25.r8.1982';
preg_match($pattern,$ip,$out);
print_r($out);
$ip = '107.225.8.19';
preg_match($pattern,$ip,$out);
print_r($out);
$ip = '225.225.225.225';
preg_match($pattern,$ip,$out);
print_r($out);
$ip = '0.0.0.0';
preg_match($pattern,$ip,$out);
print_r($out);
$ip = '00.0.0.0';
preg_match($pattern,$ip,$out);
print_r($out);
$ip = '0.202.1.0';
preg_match($pattern,$ip,$out);
print_r($out);
$ip = '0.202.1.226';
preg_match($pattern,$ip,$out);
print_r($out);
$ip = '249.202.1.0';
preg_match($pattern,$ip,$out);
print_r($out);
$s='';
for($i=0;$i<32;$i++){
$s .= '1';
}
echo $s;
echo strlen($s);
# 正则表达式匹配ip
# IP地址正则表达式匹配方法
# 匹配 IP 地址与域名的正则表达式
# JavaScript正则表达式的分组匹配详解
# javascript中匹配价格的正则表达式
# javascript正则表达式模糊匹配IP地址功能示例
# Javascript中正则表达式的全局匹配模式分析
# Javascript中使用exec进行正则表达式全局匹配时的注意事项
# javascipt匹配单行和多行注释的正则表达式
# 正则表达式匹配ip地址超详细讲解
# 正则表达式
# 很简单
# 第一部分
# 第二部分
# 两种
# 给大家
# 写到
# 这就是我
# 数为
# 百位
# 都是
# 有什么
# 我要
# 出来了
# 我在
# 成了
# 好了
# 放在
# 出了
# 就不
相关文章:
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
如何在IIS中新建站点并配置端口与物理路径?
道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?
黑客如何利用漏洞与弱口令入侵网站服务器?
建站之星如何助力网站排名飙升?揭秘高效技巧
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
高防服务器租用指南:配置选择与快速部署攻略
如何在VPS电脑上快速搭建网站?
如何设置并定期更换建站之星安全管理员密码?
制作网站的软件免费下载,免费制作app哪个平台好?
如何选择高效稳定的ISP建站解决方案?
北京的网站制作公司有哪些,哪个视频网站最好?
微信小程序制作网站有哪些,微信小程序需要做网站吗?
微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?
建站之星如何实现五合一智能建站与营销推广?
微网站制作教程,我微信里的网站怎么才能复制到浏览器里?
台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?
南宁网站建设制作定制,南宁网站建设可以定制吗?
如何在Golang中使用encoding/gob序列化对象_存储和传输数据
制作证书网站有哪些,全国城建培训中心证书查询官网?
如何解决ASP生成WAP建站中文乱码问题?
小型网站建站如何选择虚拟主机?
大同网页,大同瑞慈医院官网?
企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?
如何在云主机上快速搭建网站?
网站制作企业,网站的banner和导航栏是指什么?
义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?
孙琪峥织梦建站教程如何优化数据库安全?
建站之星安装后如何自定义网站颜色与字体?
制作公司内部网站有哪些,内网如何建网站?
Android自定义控件实现温度旋转按钮效果
c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】
哈尔滨网站建设策划,哈尔滨电工证查询网站?
IOS倒计时设置UIButton标题title的抖动问题
如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?
实惠建站价格推荐:2025年高性价比自助建站套餐解析
测试制作网站有哪些,测试性取向的权威测试或者网站?
网站微信制作软件,如何制作微信链接?
中山网站制作网页,中山新生登记系统登记流程?
建站之星安装失败:服务器环境不兼容?
我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
建站之星安全性能如何?防护体系能否抵御黑客入侵?
如何在IIS中新建站点并解决端口绑定冲突?
南平网站制作公司,2025年南平市事业单位报名时间?
高性能网站服务器部署指南:稳定运行与安全配置优化方案
定制建站流程步骤详解:一站式方案设计与开发指南
南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?
网站网页制作专业公司,怎样制作自己的网页?
利用JavaScript实现拖拽改变元素大小
*请认真填写需求信息,我们会在24小时内与您取得联系。