最近做到项目调整支持IPv6,总结一下:
IPv4的正则表达式
IPv4通常用点分十进制记法书写,例如10.100.51.148,其中的数字都是十进制,中间用实心圆点分隔。
/*验证IPv4*/
private function validateIPv4($ip)
{
return preg_match("/^((25[0-5]|2[0-4]\d|[01]?\d\d?)($|(?!\.$)\.)){4}$/", $ip);
}
一 每段为0-255的数字,有时加入 |\* 允许输入 * 号代替数字。
- 25[0-5] 匹配 250-255
- 2[0-4]\d 匹配 200-249
- [01]?\d\d? 匹配 0-199 个位数/两位数/0或1开头的三位数
二 连接符和结尾
- $| 匹配最后一段直接结束
- (?!\.$) 负向预查,表示不能以 . 结尾
- \. 连接符
- {4} 必须是4段
IPv6的正则表达式
IPv6的128位地址通常写成8组,每组为四个十六进制数的形式。
比如:CDCD:910A:2222:5498:8475:1111:3900:2020。
如果几个连续段位的值都是0,那么这些0就可以简单的以::来表示,只能用一次。
前导的零可以省略。
/*验证IPv6*/
private function validateIPv6($ip)
{
return preg_match("/^(([\da-fA-F]{1,4}){0,1}($|(?!:$):)){2,8}$/", $ip);
}
一 每段为四个十六进制数。
- ([\da-fA-F]{1,4}) 匹配 数字或字母,因为前导0可以省略,最少有一位
- {0,1} 零压缩法::中间的0000被省略,:: 里没有内容
二 连接符和结尾
- $| 匹配最后一段直接结束
- (?!: $): )) 负向预查,表示不能以 : 结尾
- : 连接符
- {2,8} 最少2段,最多8段
如有不足,欢迎指正。