php - CakePHP 自定义规则验证失败(正则表达式)

标签 php regex cakephp

我正在学习 CakePHP 2.4.0 的 Lynda.com 类(class),根据 Material ,以下代码应该可以工作,但失败并显示后一条错误消息:

    public $validate = array(
        'publication_name' => array(
            'words' => array(
                'rule' => array('custom', '/([\w.-]+ )+[\w+.-]/'),
                'message' => 'The publication name can only contain letters, numbers and spaces.',
            )
        ),
    );

“preg_match():定界符不能是字母数字或反斜杠 [CORE/Cake/Model/Validator/CakeValidationRule.php,第 281 行]”。

根据我的搜索,正则表达式应该可以正常工作,因为它使用的是非字母数字定界符 (/)。至少可以说我很困惑。

我能够让它成功保存记录的唯一方法是删除自定义验证规则(由于各种原因,这不是所需的结果)。

关于验证失败的原因的任何见解?我已经将我的代码与作者的练习文件的代码进行了比较,但不确定我(很可能)看错了什么......

提前感谢您的宝贵时间和洞察力。我真的很感激。

模型、 View 和 Controller 的源代码:http://tny.cz/0a995577

最佳答案

正如评论中所指出的,正则表达式本身在语法上是正确的,因此不会导致这样的错误。正如您所认为的,这是导致问题的另一条规则中的拼写错误。

然而,该规则也不会按预期验证 (http://regex101.com/r/dA0pH9),因为正则表达式匹配一个或多个单词(包括 .-),由单个空格,后跟单个单词 char(同样包括 .-)。它还允许添加和附加任意字符,因为它不使用 ^$

让它符合你的要求

one word, multiple words, including numbers and spaces

尝试这样的事情:

/^(\w ?)+(?<! )$/

这将匹配一个或多个单词(可能只包含数字,长度可能只有 1 个字符),由空格分隔,不允许尾随空格。

虽然它也会匹配 1 2 3 4 5 ( http://regex101.com/r/kK3jG9/ ) 之类的内容,但可能不适用,因此您可能需要对其进行优化,例如要求至少包含 1 个字母每个单词,最小长度为 3 个字符:

/^((?=\d*[a-z])\w{3,} ?)+(?<! )$/i

快速分割:

(
  (?=\d*[a-z])  # the word must contain at least one letter
  \w{3,} ?      # a word with at least 3 chars, optionally followed by a space
)+              # one or more times
(?<! )          # no trailing space allowed

关于php - CakePHP 自定义规则验证失败(正则表达式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19280941/

相关文章:

php - Cakephp 3.0单元测试错误

php - 使用 proc_open 流式传输运行时生成的 gzip 文件

objective-c - Objective C 正则表达式以 1 或 2 位数字开头

javascript - Cakephp 复选框 CSS 不工作

Java正则表达式匹配整数

javascript - 帮助正则表达式替换字符串中的第二个逗号

Cakephp博客教程错误

PHP $_POST 变量有时为空

php - .txt 写入 .json 文件批处理或需要 php 文件

php - 使用 zend gdata 插件上传文档