正则匹配IP的图文详解

这次给大家带来正则匹配IP的图文详解,正则匹配IP的注意事项有哪些,下面就是实战案例,一起来看一下。

这里给大家详细讲解一下一个匹配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 '
';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);

登录后复制

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

推荐阅读:

js里的正则实现数字每隔四位用空格分隔效果

在PHP里使用正则的效率 贪婪、非贪婪与回溯详解(附代码)

以上就是正则匹配IP的图文详解的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2777686.html

(0)
上一篇 2025年3月8日 15:12:13
下一篇 2025年3月8日 15:12:26

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 正则表达式分组的详解(附代码)

    这次给大家带来正则表达式分组的详解(附代码),正则表达式分组的注意事项有哪些,下面就是实战案例,一起来看一下。 正则表达式分组:如果想匹配3个数字,正则表达式可以用如下写法: d{3} 以上代码使用重复量词可以匹配3位数字。但是在实际应用中…

    编程技术 2025年3月8日
    200
  • 正则表达式的d元字符使用详解(附代码)

    这次给大家带来正则表达式的d元字符使用详解(附代码),使用正则表达式d元字符的注意事项有哪些,下面就是实战案例,一起来看一下。 正则表达式d元字符:d元字符可以匹配数字字符,等价于”[0-9]”。 语法结构: 构造函…

    2025年3月8日
    200
  • 正则表达式的.号元字符使用详解(附代码)

    这次给大家带来正则表达式的.号元字符使用详解(附代码),使用正则表达式.号元字符的注意事项有哪些,下面就是实战案例,一起来看一下。 正则表达式.号元字符:点号(.)元字符可以匹配除了回车符()和换行符()之外的任意字符。语法结构:构造函数方…

    编程技术 2025年3月8日
    200
  • 正则表达式W元字符的使用详解(附代码)

    这次给大家带来正则表达式W元字符的使用详解(附代码),正则表达式W元字符使用的注意事项有哪些,下面就是实战案例,一起来看一下。 正则表达式W元字符:W(大写)用来匹配非单词字符,它等价于”[^a-zA-Z0-9_]”…

    编程技术 2025年3月8日
    200
  • 正则表达式u修饰符的使用详解(附代码)

    这次给大家带来正则表达式u修饰符的使用详解(附代码),正则表达式u修饰符使用的注意事项有哪些,下面就是实战案例,一起来看一下。 正则表达式u修饰符: 此修饰符标识能够正确处理大于uFFFF的Unicode字符。也就是说,会正确处理四个字节的…

    编程技术 2025年3月8日
    200
  • 正则的模式修饰符使用详解

    这次给大家带来正则的模式修饰符使用详解,使用正则模式修饰符的注意事项有哪些,下面就是实战案例,一起来看一下。 i (PCRE_CASELESS) 如果设置了这个修饰符,模式中的字母会进行大小写不敏感匹配。 m (PCRE_MULTILINE…

    编程技术 2025年3月8日
    200
  • 正则表达式m修饰符(多行匹配)使用详解

    这次给大家带来正则表达式m修饰符(多行匹配)使用详解,使用正则表达式m修饰符(多行匹配)的注意事项有哪些,下面就是实战案例,一起来看一下。 正则表达式m修饰符: m修饰符规定正则表达式可以执行多行匹配。m修饰符的作用是修改^和$在正则表达式…

    编程技术 2025年3月8日
    200
  • 大小写不敏感的i修饰符使用详解

    这次给大家带来大小写不敏感的i修饰符使用详解,使用大小写不敏感i修饰符的注意事项有哪些,下面就是实战案例,一起来看一下。 正则表达式i修饰符: i修饰符用来规定正则表达式的匹配是大小写不敏感的。 语法结构: 构造函数方式: new RegE…

    编程技术 2025年3月8日
    200
  • 正则全局匹配模式g修饰符的使用详解

    这次给大家带来正则全局匹配模式g修饰符的使用详解,使用正则全局匹配模式g修饰符的注意事项有哪些,下面就是实战案例,一起来看一下。 正则表达式g修饰符: g修饰符用语规定正则表达式执行全局匹配,也就是在找到第一个匹配之后仍然会继续查找。 语法…

    编程技术 2025年3月8日
    200
  • 正则怎么匹配Abba逆向前瞻

    这次给大家带来正则怎么匹配Abba逆向前瞻,正则匹配Abba逆向前瞻的注意事项有哪些,下面就是实战案例,一起来看一下。 核心代码: var s1 = ‘acritan’;var s2 = ‘bassarisk’;var s3 = ‘comm…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论