我正在关注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
答案 0 :(得分:2)
正如评论中所指出的,正则表达式本身在语法上是正确的,所以它不会导致这样的错误。正如您所知,这是导致问题的另一条规则中的拼写错误。
但是规则也不会按预期验证(http://regex101.com/r/dA0pH9),因为正则表达式匹配由单个空格分隔的一个或多个单词(包括.
和-
),单词char(再次包括.
和-
)。它还允许预先添加和附加任意字符,因为它不使用^
和$
。
使其符合您的要求
一个单词,多个单词,包括数字和空格
尝试这样的事情:
/^(\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