正则表达式用逗号分隔端口

时间:2016-04-05 19:53:09

标签: php regex validation

问题

我有一个工作端口有效性检查器,但是我需要用逗号分隔端口(没有空格)。例如,而不是只有'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 |,?$)附加到查询的末尾,但是这不起作用。

2 个答案:

答案 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)

其他方式,你可以否定你正在寻找的东西。这意味着:

  • 5位数字高于65535,或至少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修饰符可以打开非锚定模式的优化。

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