【问题标题】:PHP Pattern ValidationPHP 模式验证
【发布时间】:2016-03-22 19:38:59
【问题描述】:

我在让我的模式正确验证字符串条目时遇到了一些麻烦。此作业的 PHP 部分工作正常,因此我不会在此处包含该部分,以使其更易于阅读。有人能告诉我为什么这个模式与我想要做的不匹配吗?

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

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

    $codecheck = '/^([[:lower:]]{3,6}-)|([[:lower:]]{3,6} ?)\d{1,3}$/';
    

目前这满足了大多数要求,但它似乎只验证了最低字符要求 - 并且在输入超过 6 个或 3 个字符(分别)时不会返回 false。

提前感谢您的帮助!

【问题讨论】:

  • 使用 [\s-] 代替“或”管道来查找 - 或空格。
  • 你不需要复制较低的/^[[:lower:]]{3,6}[\s-]\d{1,3}$/
  • 我认为design-patterns 标签在这里不合适。你应该改用regex。
  • @AbraCadaver,请将其写为答案而不是评论。

标签: php regex validation


【解决方案1】:

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

  • ^([[: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 位数字
  • $ - 字符串结束

【讨论】:

  • @Shaw:只是为了澄清你的正则表达式也可以工作,一旦将交替放入一个组中:^(?:([[:lower:]]{3,6}-)|([[:lower:]]{3,6} ?))\d{1,3}$。但是,效率不高。
  • 感谢您指出这一点 - 因为我只是在学习它,很高兴知道我在教育目的上走在正确的轨道上,但还没有看到关于效率的全貌。跨度>
  • 当使用这样的交替时,回溯会增加返回匹配/或检测不匹配字符串所需的步骤数。请参阅显示步骤数的绿色框,其中包含 your regex 和 mine。尽管该步数并不是性能的直接指标,但当步数像本例一样翻倍时,它暗示了两种模式之间的性能差异。
【解决方案2】:

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

现在这样:

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

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

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

【讨论】:

  • 感谢分解!
猜你喜欢
  • 2014-08-29
  • 1970-01-01
  • 2013-10-24
  • 1970-01-01
  • 2014-03-13
  • 1970-01-01
  • 2019-04-27
  • 2012-05-02
  • 2012-03-29
相关资源
最近更新 更多