Php Regex用逗号分隔端口

Php Regex用逗号分隔端口,php,regex,validation,Php,Regex,Validation,问题 我有一个工作端口有效性检查器,但是我需要用逗号分隔端口,不能有空格。例如,现在“804438080”将有效,而不仅仅是“80” 正则表达式 尝试 我意识到我可能需要将查询分解,因此尝试了很多方法,包括在查询末尾添加此、\n |、?$,但是这不起作用。由于它是PHP,具有PCRE regex风格,您可以使用子例程轻松递归子模式: ^(6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{

问题

我有一个工作端口有效性检查器,但是我需要用逗号分隔端口,不能有空格。例如,现在“804438080”将有效,而不仅仅是“80”

正则表达式

尝试


我意识到我可能需要将查询分解,因此尝试了很多方法,包括在查询末尾添加此、\n |、?$,但是这不起作用。

由于它是PHP,具有PCRE regex风格,您可以使用子例程轻松递归子模式:

^(6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{1,3}|[0-9])(?:,(?1))*$

说明:

^-字符串的开头 第1组:单端口验证子模式 ?:,?1*-0+的序列,后跟上面的子模式以及?1子例程,该子例程在组1内重复使用该模式 $-字符串结尾
换句话说,你可以否定你正在寻找的东西。这意味着:

65535以上的5位数字,或至少6位数字 连续逗号,或字符串末尾或开头的逗号 不是数字或逗号的字符 要使用这种模式,显然需要否定preg_match函数:

return !preg_match('~6(?:5(?:5(?:3(?:[6-9]|\d{2})|[4-9]\d)|[6-9]\d{2})|[6-9]\d{3})|[7-9]\d{4}|[1-9]\d{5}|\B,|,\B|[^\d,]~S', $str);
“S”修改器打开非锚定图案的优化


这种方法可能很有趣,因为一旦模式成功,搜索就会停止。

如果正则表达式变得那么长,那么最好将其重构为其他字符串操作和更清晰的正则表达式。例如,我修改了正则表达式演示,允许同时使用破折号和逗号分隔端口,因此,必须验证端口的格式是80-81还是80,81,82
return !preg_match('~6(?:5(?:5(?:3(?:[6-9]|\d{2})|[4-9]\d)|[6-9]\d{2})|[6-9]\d{3})|[7-9]\d{4}|[1-9]\d{5}|\B,|,\B|[^\d,]~S', $str);