PHP模式验证

时间:2016-03-22 19:38:59

标签: php regex validation

我在使用模式正确验证字符串条目时遇到了一些麻烦。这个赋值的PHP部分工作正常,所以我不会在这里包含它,以使这更容易阅读。有人能告诉我为什么这种模式与我想要做的不匹配吗?

此模式具有以下验证要求:

  1. 首先应该有3-6个小写字母
  2. 紧接着是连字符或空格
  3. 后跟1-3位

    $codecheck = '/^([[:lower:]]{3,6}-)|([[:lower:]]{3,6} ?)\d{1,3}$/';
    
  4. 目前,这可以满足大部分要求,但它似乎只能验证最低字符要求 - 并且当输入的字符数超过6或3个字符时,不会返回false。

    提前感谢您的任何帮助!

2 个答案:

答案 0 :(得分:4)

这里的问题在于如何对备选方案进行分组。现在,正则表达式匹配

的字符串
  • ^([[:lower:]]{3,6}-) - 以3-6个小写字母开头,后跟连字符
  • | - 或
  • ([[:lower:]]{3,6} ?)\d{1,3}$ - 以3-6个小写字母结尾,后跟可选空格,后跟1-3位数字。

事实上,你可以完全摆脱交替:

$codecheck = '/^\p{Ll}{3,6}[- ]\d{1,3}$/';

请参阅regex demo

解释

  • ^ - 字符串开头
  • \p{Ll}{3,6} - 3-6个小写字母
  • [- ] - 匹配一个字符(连字符或空格)的正字符类
  • \d{1,3} - 1-3位数
  • $ - 字符串结尾

答案 1 :(得分:2)

您需要在正则表达式中间划分|运算符的范围。

现在:

  • OR的右侧参数一直运行到正则表达式的最后,甚至包括$。因此,字符串结束条件的数字 不适用于|的左侧。

  • OR的左侧参数以^开头, 适用于左侧。

这就是为什么在提供7个小写字符时获得匹配的原因。第一个字符被忽略,其余字符与正则表达式模式的右侧匹配。