拿 IP 中的其中一个数字来说,既然是数字,那么我们可以使用正则表达式 [0-9]{1,3}
来表示。由于[0-9]{1,3}
可以匹配的取值范围在 0~999 之间,超出了 IP 的有效范围,所以不能使用[0-9]{1,3}
。 想要保证 IP 地址的数字部分不超过 255,可以将 0~255 这个范围划分为 4 个范围,分别是 0~99、100~199、200~249、250~255,这样就可以很方便的使用正则表达式表示了,如下所示:
([0-9]?[0-9])|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5])
表达式的具体含义可以对照《PHP正则表达式》一节中的内容,这里不再赘述。
有了上面的正则表达式,剩下的部分就简单多了,最简单的就是将上面的正则表达式重复 4 遍,同时在每一遍之间加上“/.”来表示 IP 地址中的“.”,如下所示:
((([0-9]?[0-9])|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))/.)((([0-9]?[0-9])|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))/.)((([0-9]?[0-9])|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))/.)(([0-9]?[0-9])|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))
将正则表达式写成上面这样虽然逻辑上是正确的,但是太长了,并且不方便阅读,所以我们还可以将它精简一下。
((([0-9]?[0-9])|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))/.){3}(([0-9]?[0-9])|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))
至此正则表达式就是定义好了,下面就将它放到代码中来验证一下,示例代码如下所示:
<?php function validateip($ip){ $preg="/^((([0-9]?[0-9])|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))/.){3}(([0-9]?[0-9])|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))/"; preg_match($preg,$ip,$matches); if(!empty($matches)) return 1; return 0; } $arr_ip = [ '-192.168.0.1', '127.0.0.1', '218.206.211.1', '192.0.133.255', '255.255.255.0', '-192.245.0.255', '11.12.13.14', '192.256.255.255' ]; foreach ($arr_ip as $value) { if(validateip($value)){ echo $value.' 是正确的 IP 地址<br>'; }else{ echo $value.' 不是正确的 IP 地址<br>'; } } ?>
运行结果如下:
-192.168.0.1 不是正确的 IP 地址
127.0.0.1 是正确的 IP 地址
218.206.211.1 是正确的 IP 地址
192.0.133.255 是正确的 IP 地址
255.255.255.0 是正确的 IP 地址
-192.245.0.255 不是正确的 IP 地址
11.12.13.14 是正确的 IP 地址
192.256.255.255 不是正确的 IP 地址
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/23966.html