PHP模式验证
我在让模式正确验证字符串条目时遇到了一些问题。本作业的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
$codecheck = '/^([[:lower:]]{3,6}-)|([[:lower:]]{3,6} ?)\d{1,3}$/';
提前感谢您的帮助 这里的问题在于如何对备选方案进行分组。现在,正则表达式匹配一个
-以3-6个小写字母开头,后跟连字符^([[:lower:]{3,6}-
-或|
-以3-6个小写字母结尾,后跟可选空格,后跟1-3位数字([[:lower:]{3,6}?\d{1,3}$
$codecheck = '/^\p{Ll}{3,6}[- ]\d{1,3}$/';
见
说明:
-字符串的开头^
-3-6个小写字母\p{Ll}{3,6}
-与一个字符(连字符或空格)匹配的正字符类[-]
-1-3位\d{1,3}
-字符串结尾$
- OR的右侧参数一直运行到正则表达式的末尾,甚至包括
。因此,或字符串结束条件的数字不适用于$
的左侧 - OR的左侧参数以
开头,并且仅适用于左侧^
这就是为什么当您提供7个小写字符时会得到匹配。忽略第一个字符,其余字符与正则表达式模式的右侧匹配。使用[\s-]而不是“or”管道来查找-或空格。您不需要复制较低的
/^[:lower:]{3,6}[\s-]\d{1,3}$/
设计模式标记。您可能应该改用regex
。@Abracadver,请将其作为答案而不是注释来写。@Shaw:只是为了澄清,一旦将替换项放入一个组中,您的regex也可以工作:。但是,它不是有效的。感谢你指出——我只是在学习,很高兴知道我在教育目的上走的是正确的道路,但还没有看到效率方面的全貌。当使用这样的交替时,回溯是指增加返回匹配或检测不匹配字符串所需的步骤数。请参见显示带有和的步骤数的绿色框。虽然这一步数不是性能的直接指标,但当步数像本例中那样翻倍时,它暗示了两种模式之间的性能差异。感谢您将其分解!