PHP模式验证

PHP模式验证,php,regex,validation,Php,Regex,Validation,我在让模式正确验证字符串条目时遇到了一些问题。本作业的PHP部分工作正常,因此为了便于阅读,我不在这里介绍。有人能告诉我为什么这个模式和我想做的不匹配吗 此模式具有以下验证要求: 首先应该有3-6个小写字母 紧接着是连字符或空格 后跟1-3位数字 $codecheck = '/^([[:lower:]]{3,6}-)|([[:lower:]]{3,6} ?)\d{1,3}$/'; 目前,它捕获了大多数需求,但它似乎只验证了最低字符需求——当输入的字符数分别超过6或3个时,它不会返回false

我在让模式正确验证字符串条目时遇到了一些问题。本作业的PHP部分工作正常,因此为了便于阅读,我不在这里介绍。有人能告诉我为什么这个模式和我想做的不匹配吗

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

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

    $codecheck = '/^([[:lower:]]{3,6}-)|([[:lower:]]{3,6} ?)\d{1,3}$/';
    
  • 目前,它捕获了大多数需求,但它似乎只验证了最低字符需求——当输入的字符数分别超过6或3个时,它不会返回false


    提前感谢您的帮助

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

    • ^([[:lower:]{3,6}-
      -以3-6个小写字母开头,后跟连字符
    • |
      -或
    • ([[:lower:]{3,6}?\d{1,3}$
      -以3-6个小写字母结尾,后跟可选空格,后跟1-3位数字
    事实上,您可以完全消除这种交替:

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

    说明:

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

    您需要在正则表达式的中间分隔<代码> < < /代码>运算符。 现在的情况是:

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

    • OR的左侧参数以
      ^
      开头,并且仅适用于左侧


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

    使用[\s-]而不是“or”管道来查找-或空格。您不需要复制较低的
    /^[:lower:]{3,6}[\s-]\d{1,3}$/
    设计模式标记。您可能应该改用
    regex
    。@Abracadver,请将其作为答案而不是注释来写。@Shaw:只是为了澄清,一旦将替换项放入一个组中,您的regex也可以工作:。但是,它不是有效的。感谢你指出——我只是在学习,很高兴知道我在教育目的上走的是正确的道路,但还没有看到效率方面的全貌。当使用这样的交替时,回溯是指增加返回匹配或检测不匹配字符串所需的步骤数。请参见显示带有和的步骤数的绿色框。虽然这一步数不是性能的直接指标,但当步数像本例中那样翻倍时,它暗示了两种模式之间的性能差异。感谢您将其分解!