PHP正则匹配CIDR格式IP斜杠后1-31范围数字的正确写法
错误原因分析
- 第一个正则
//[1-3][0-9]/仅能匹配1039的两位数,所以单数字的`/8`无法命中,同时超出了131的取值范围要求。 - 第二个正则
/\/[1-31]{1,2}/中方括号[]内的规则是匹配单个字符,[1-31]实际等价于匹配1/2/3三个字符,完全不符合数值范围匹配逻辑,所以结果错误。
正确实现代码
要匹配1~31的数值,正则需要拆分范围实现:
- 1~9:
[1-9] - 10~29:
[12][0-9] - 30~31:
3[01]
最终的preg_match_all语句如下:
preg_match_all('/\/([1-9]|[12][0-9]|3[01])(?![0-9])/', $str, $matches);
结果说明
- 带斜杠的完整匹配结果存放在
$matches[0]中,输出为['/17', '/23', '/8', '/18'] - 仅提取数字的话取
$matches[1]即可,输出为['17', '23', '8', '18'] - 末尾的
(?![0-9])是负向先行断言,避免匹配到更长数字的前缀(比如/32不会被误匹配为/3),适配更复杂的输入场景。
内容的提问来源于stack exchange,提问作者user3052443
相关产品推荐
相关产品推荐

