到目前位置Cake支持VALID_NOT_EMPTY, VALID_NUMBER, VALID_EMAIL, 和VALID_YEAR四个验证规则,Cake1.2新的验证类功能更强大,Cake 1.2中虽然VALID_NOT_EMPTY, VALID_NUMBER, VALID_EMAIL和VALID_YEAR四个验证规则仍然可用,但是已经不推荐再使用了(deprecated).
/*
*
* Deprecated
*/
/*
*
* Not empty.
*/
define('VALID_NOT_EMPTY', '/.+/'
);
/*
*
* Numbers [0-9] only.
*/
define('VALID_NUMBER', '/^[-+]?/b[0-9]*/.?[0-9]+/b$/'
);
/*
*
* A valid email address.
*/
define('VALID_EMAIL', '//A(?:^([a-z0-9][a-z0-9_/-/./+]*)@([a-z0-9][a-z0-9/./-]{0,63}/.(com|org|net|biz|info|name|net|pro|aero|coop|museum|[a-z]{2,4}))$)/z/i'
);
/*
*
* A valid year (1000-2999).
*/
define('VALID_YEAR', '/^[12][0-9]{3}$/');
1.2 中新的验证规则的用法如下模式(在模型中):
var $validate = array('field' => array('rule' => array('validationmethod', 'param1', 'param2')));
好了,让我们来看看验证方法:
1. alphaNumeric
仅允许字母和数字
var $validate = array('username' => array('rule' => array('alphaNumeric')));
2. between
对between的理解容易让人迷惑,看起来它像是检查一个数字的范围,但实际上它检查的是字符串长度的范围
下面的验证规则表示用户名称字符串允许至少3个,最多10个字符.
var $validate = array('username' => array('rule' => array('between', 3, 10)));
3. blank
验证字符是否为空,或则仅包含空白字符,例如space,tab
var $validate = array('x' => array('rule' => array('blank')));
4. cc
检查信用卡号的有效性,例如Visa卡
var $validate = array('creditcard' => array('rule' => array('cc', array('visa'))));
从validation.php源代码看,下面是目前支持的卡种:
$cards = array
(
'all' => array
(
'amex' => '/^3[4|7]/d{13}$/',
'bankcard' => '/^56(10/d/d|022[1-5])/d{10}$/',
'diners' => '/^(?:3(0[0-5]|[68]/d)/d{11})|(?:5[1-5]/d{14})$/',
'disc' => '/^(?:6011|650/d)/d{12}$/',
'electron' => '/^(?:417500|4917/d{2}|4913/d{2})/d{10}$/',
'enroute' => '/^2(?:014|149)/d{11}$/',
'jcb' => '/^(3/d{4}|2100|1800)/d{11}$/',
'maestro' => '/^(?:5020|6/d{3})/d{12}$/',
'mc' => '/^5[1-5]/d{14}$/',
'solo' => '/^(6334[5-9][0-9]|6767[0-9]{2})/d{10}(/d{2,3})?$/',
'switch' => '/^(?:49(03(0[2-9]|3[5-9])|11(0[1-2]|7[4-9]|8[1-2])|36[0-9]{2})/d{10}(/d{2,3})?)|(?:564182/d{10}(/d{2,3})?)|(6(3(33[0-4][0-9])|759[0-9]{2})/d{10}(/d{2,3})?)$/',
'visa' => '/^4/d{12}(/d{3})?$/',
'voyager' => '/^8699[0-9]{11}$/'
)
,
'fast' => '/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6011[0-9]{12}|3(?:0[0-5]|[68][0-9])[0-9]{11}|3[47][0-9]{13})$/'
);
5. comparison
用于比较数字值,它支持"is greater", "is less", "greater or equal", "less or equal", "is less", "equal to",
和"not equal",检查年龄是否大于18:
var $validate = array('age' => array('rule' => array('comparison', '>=', 18
)));
#或则
var $validate = array('age' => array('rule' => array('comparison', 'greater or equal', 18)));
6. custom
你可以自己指定一个正则表达式
var $validate = array('username' => array('rule' => array('custom', '/^[0-9a-z]+$/i')));
7. date
检查日期的有效性,支持不同的格式,细节请查看validation类的api(http://api.cakephp.org/1.2/class_validation.html),
检查日期是否为'yyyy-mm-dd'格式
var $validate = array('startdate' => array('rule' => array('date', 'ymd')));
8. decimal
检查十进制数的有效性.如果你要使十进制数保持小数点后两位,可以这样做:
var $validate = array('price' => array('rule' => array('decimal', 2)));
9. email
这个就不解释了.
var $validate = array('email' => array('rule' => array('email')));
10. numeric
numeric是一个PHP is_numeric函数的封装.
var $validate = array('age' => array('rule' => array('numeric')));
11. phone
默认的,这个对我们没什么用,中国的电话号码和US不一样,但是Cake开发团队为我们想的足够多,我们可以加入对
我亲爱祖国的电话号码支持.
var $validate = array('phone' => array('rule' => array('phone', null, 'us')));
12. postal
邮政编码
一样的不支持ZH_CN的邮编,没办法,自己写个扩展吧,支持美国,加拿大,英国.
postal() 方法的源代码:
function postal($check, $regex
= null, $country = null
) {
if
(is_array($check)) {
$this->
_extract($check);
} else
{
$this->check =
$check;
$this->regex =
$regex;
$this->country =
$country;
}
if(is_null($this->
regex)) {
switch ($this->
country) {
case 'us'
:
$this->regex = '//A/b[0-9]{5}(?:-[0-9]{4})?/b/z/i'
;
break
;
case 'uk'
:
$this->regex = '//A/b[A-Z]{1,2}[0-9][A-Z0-9]? [0-9][ABD-HJLNP-UW-Z]{2}/b/z/i'
;
break
;
case 'ca'
:
$this->regex = '//A/b[ABCEGHJKLMNPRSTVXY][0-9][A-Z] [0-9][A-Z][0-9]/b/z/i'
;
break
;
}
}
return $this->
_check();
}
var $validate = array('zipcode' => array('rule' => array('postal', null, 'us')));
13. ssn
验证美国,丹麦,荷兰的社会安全号.
var $validate = array('ssn' => array('rule' => array('ssn', null, 'us')));
14. url
验证一个url的有效性
var $validate = array('website' => array('rule' => array('url')));
15. equalTo
目前该验证规则未实现
16. minLength
验证字符串的小长度,如果你要求用户名必须大于3个字符,你可以这样:
var $validate = array('username' => array('rule' => array('minLength', 3)));
17. maxLength
字符串允许的最大长度.例如,你运行用户名最多有20个字符:
var $validate = array('username' => array('rule' => array('maxLength', 20)));
18. multiple
未实现
19. number
未实现
20. userDefined
userDefined 貌似可以定义自己的验证规则,但现在,不知道如何使用它.
21. ip
验证ip地址
var $validate = array('ip' => array('rule' => 'ip'));