3

我正在关注 CakePHP 2.4.0 的 Lynda.com 课程,并且根据材料,以下代码应该可以工作,但由于后面的错误消息而失败:

    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 行]”。

根据我的搜索,正则表达式应该像使用非字母数字分隔符 (/) 一样工作。至少可以说我很困惑。

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

关于为什么验证失败的任何见解?我已经将我的代码与作者的练习文件的代码进行了比较,并且不确定我(最有可能)在看什么......

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

模型、视图和控制器的源代码:http: //tny.cz/0a995577

4

1 回答 1

2

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

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

使其符合您的要求

一个词,多个词,包括数字和空格

尝试这样的事情:

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

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

虽然它也可以匹配1 2 3 4 5http://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
于 2013-10-10T12:17:59.023 回答