我正在遵循 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
正如注释中指出的那样,正则表达式本身在语法上是正确的,因此它不会导致这样的错误。正如您所认为的那样,这是导致问题的不同规则中的拼写错误。
但是,该规则也不会按预期(http://regex101.com/r/dA0pH9(进行验证,因为正则表达式匹配一个或多个单词(包括.
和-
(,由单个空格分隔,后跟单个单词字符(再次包括.
和-
(。它还允许预置和附加任意字符,因为它不使用^
和$
。
使其符合您的要求
一个单词,多个单词,包括数字和空格
尝试这样的事情:
/^('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