问题
我有一个工作端口有效性检查器,但是我需要用逗号分隔端口(没有空格)。例如,而不是只有'80'有效,现在'80,443,8080'将是有效的。
正则表达式
(^(?: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])$
试过
我意识到我可能需要打破查询,所以尝试了很多东西,包括将这个(,\ n |,?$)附加到查询的末尾,但是这不起作用。
答案 0 :(得分:2)
由于它是PHP,具有PCRE正则表达式风格,您可以使用子例程轻松递归子模式:
^(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))*$
请参阅regex demo
解释:
^
- 字符串开头(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))*
- ,
的0+序列后跟上面的子模式(使用(?1)
子例程重新使用组1内的模式)$
- 字符串结尾答案 1 :(得分:0)
其他方式,你可以否定你正在寻找的东西。这意味着:
要使用这种模式,您显然需要否定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修饰符可以打开非锚定模式的优化。
这种方法很有意思,因为一旦模式成功,搜索就会停止。