46.2. 标准校验类
Zend Framework 带有一组标准的校验类供你使用。
46.2.1. Alnum
当且仅当$value
只包含字母和数字字符,返回 true
。这个校验器包括一个考虑空白字符是否有效的选项。
46.2.2. Alpha
当且仅当$value
只包含字母字符,返回 true
。这个校验器包括一个考虑空白字符是否有效的选项。
46.2.3. Barcode
这个校验器是个带有条码类型的实例,条码类型是根据你希望用来校验条码值而定。它目前支持 "UPC-A
" (通用产品码)和 "EAN-13
" (欧洲商品码)条码类型,当且仅当输入成功通过条码校验算法的校验,isValid()
返回 true。你应该从输入中删除除了数字0到9(0-9)以外的其它字符,然后传递给校验器。
46.2.4. Between
当且仅当$value
在最小值和最大值之间,返回true
。缺省地,比较包含边界值($value
可以等于边界值),尽管为了做精确地比较这个可以被覆盖。所谓精确地比较,就是$value
必须大于最小值和小于最大值。
46.2.5. Ccnum
当且仅当$value
遵循Luhn(mod-10 checksum)算法,返回true
。
46.2.6. 日期
当$value
是一个格式为YYYY-MM-DD
的有效日期,返回true
。如果locale
选项被设置那么日期将根据locale来校验,如果format
选项被设置成这个格式用来校验。关于选项参数的细节参见Zend_Date::isDate()。
46.2.7. 数字
当且仅当$value
只包含数字字符,返回 true
。
46.2.8. Email 地址
Zend_Validate_EmailAddress
允许你校验一个email地址。首先校验器把email地址分成local-part和@hostname并试图按照email地址和主机名的规范来匹配它。
基本用法
一个基本用法的例子如下:
$validator = new Zend_Validate_EmailAddress(); if ($validator->isValid($email)) { // email appears to be valid } else { // email is invalid; print the reasons foreach ($validator->getMessages() as $message) { echo "$message\n"; } }
这个例子匹配email地址$email
并在匹配失败的时候用$validator->getMessages()
来获得有用的错误信息。
复杂的local parts
Zend_Validate_EmailAddress
根据RFC2822来匹配任何有效的email地址。例如,有效的email地址包括bob@DOMain.com
, bob+jones@domain.us
, "bob@jones"@domain.com
和 "bob jones"@domain.com
。一些过时的email格式目前不再校验(例如email地址中的回车符或"\"符)。
校验不同类型的主机名
Email地址中的主机名部分依靠Zend_Validate_Hostname
来校验。尽管你希望IP地址和本地主机名也被接受,但缺省地只有像domain.com
格式的DNS主机名被接受。
当然如果你想如愿,需要实例化Zend_Validate_EmailAddress
并传递一个参数来指明哪种主机名你想接受。更多的细节包含在Zend_Validate_Hostname
中。
下面的例子显示如何同时接受DNS和本地主机名:
$validator = new Zend_Validate_EmailAddress(Zend_Validate_Hostname::ALLOW_DNS | Zend_Validate_Hostname::ALLOW_LOCAL); if ($validator->isValid($email)) { // email appears to be valid } else { // email is invalid; print the reasons foreach ($validator->getMessages() as $message) { echo "$message\n"; } }
检查主机名是否确实接受email
email地址的格式正确并不意味着这个email地址确实存在。为解决这个问题,你可以用MX校验来检查一个MX(email)条目的主机名是否存在于DNS的纪录里。这将告诉你这个主机名接受email,但并不告诉你确切的email地址是有效的。
MX 检查不是缺省地激活的,并且目前只支持UNIX平台。为激活MX检查,你可以传递第二个参数给Zend_Validate_EmailAddress
构造器。
$validator = new Zend_Validate_EmailAddress(Zend_Validate_Hostname::ALLOW_DNS, true);
另外你可以传递 true
或 false
给$validator->setValidateMx()
来激活或禁止 MX 校验。
用激活这个设置的网络函数将用来为你所想校验的email地址的主机名中的MX记录的存在做检查。请注意这将可能把你的脚本变慢。
校验国际域名
Zend_Validate_EmailAddress
也将匹配存在于某些域名中的国际字符。这就是国际域名(IDN)支持。这个是缺省激活,你可以通过用存在于 Zend_Validate_EmailAddress
中的内部的 Zend_Validate_Hostname
对象来改变设置来禁止。
$validator->hostnameValidator->setValidateIdn(false);
关于 setValidateIdn()
更多的信息在Zend_Validate_Hostname
文档中。
请注意你有你允许DNS 主机名被校验,国际域名(IDNs)才被校验。
校验顶级域名
缺省地用已知的TLDs列表来检查主机名。你可以通过用存在于Zend_Validate_EmailAddress
中的内部的 Zend_Validate_Hostname
对象来改变设置来禁止。
$validator->hostnameValidator->setValidateTld(false);
关于 setValidateTld()
更多的信息在Zend_Validate_Hostname
文档中。
请注意你有你允许DNS 主机名被校验,顶级域名(TLDs)才被校验。
46.2.9. 浮点数
当且仅当$value
是一个浮点数值,返回 true
。
46.2.10. GreaterThan
当且仅当$value
大于最小值,返回 true
。
46.2.11. 十六进制数
当且仅当$value
只包含十六进制的数字字符,返回 true
。
46.2.12. 主机名
Zend_Validate_Hostname允许你根据一组已知的规范来校验主机名。它检查三种不同的主机名:DNS主机名(例如domain.com),IP地址(例如1.2.3.4),和本地主机名(例如localhost)。缺省地,只有DNS主机名被匹配。
基本用法
一个基本用法的例子如下:
<?PHP require_once 'Zend/Validate/Hostname.php'; $validator = new Zend_Validate_Hostname(); if ($validator->isValid($hostname)) { // hostname appears to be valid } else { // hostname is invalid; print the reasons foreach ($validator->getMessages() as $message) { echo "$message\n"; } }
这个例子匹配主机名$hostname
并在匹配失败的时候用$validator->getMessages()
来获得有用的错误信息。
校验不同类型的主机名
你可能发现你也想匹配IP地址,本地主机名,或者是所有允许类型的组合。这个可以在当你实例化它的时候通过传递参数给Zend_Validate_Hostname来实现。 参数应该是一个整型数,它来决定哪种主机名被允许。我们鼓励你使用常量。
Zend_Validate_Hostname 常量是: ALLOW_DNS
允许DNS主机名,
ALLOW_IP
允许IP地址, ALLOW_LOCAL
允许本地网络名,和ALLOW_ALL
允许所有三种类型。 你可以用下面的例子仅仅检查IP地址:
<?php require_once 'Zend/Validate/Hostname.php'; $validator = new Zend_Validate_Hostname(Zend_Validate_Hostname::ALLOW_IP); if ($validator->isValid($hostname)) { // hostname appears to be valid } else { // hostname is invalid; print the reasons foreach ($validator->getMessages() as $message) { echo "$message\n"; } }
你可以用这些类型的组合,也可以用ALLOW_ALL
来接受所有主机名类型。例如,你可以通过如下例子实例化Zend_Validate_Hostname对象来接受DNS和本地主机名:
<?php $validator = new Zend_Validate_Hostname(Zend_Validate_Hostname::ALLOW_DNS | Zend_Validate_Hostname::ALLOW_LOCAL);}
校验国际域名
一些国家代码顶级域名(ccTLDs),例如'de'(德国),在域名中支持国际字符。这些就是大家所知的国际域名(IDN)。这些域名可以用Zend_Validate_Hostname通过用于校验处理的扩展字符来匹配。
目前支持ccTLDs的有:
at (Austria)
ch (Switzerland)
li (Liechtenstein)
de (Germany)
fi (Finland)
hu (Hungary)
no (Norway)
se (Sweden)
匹配IDN域名就像使用标准主机名校验器一样简单,因为IDN匹配是缺省激活的。如果你想禁止IDN校验,可以通过传递参数给Zend_validate_Hostname构造器或通过$validator->setValidateIdn()
方法来实现。
你可以象下面通过传递第二个参数给Zend_Validate_Hostname构造器来禁止IDN校验。
<?php $validator = new Zend_Validate_Hostname(Zend_Validate_Hostname::ALLOW_DNS, false);
另外你可以通过传递 TRUE 或 FALSE 给 $validator->setValidateIdn()
来激活或者禁止 IDN 校验。如果你试图匹配一个当前不被支持的IDN主机名,并且如果有国际字符在其中,校验很可能会失败。当指定附加字符的ccTLD文件在Zend/Validate/Hostname下不存在时,一个正常的主机名校验将被执行。(这就是在解释上句话中为什么校验会失败,Jason 注)
请注意只有当你允许DNS主机名被校验,IDNs才能被校验。
校验顶级域名
缺省地主机名通过已知的TLDs列表来检查。如果不需要这个功能,它可以被禁止,就像禁止IDN支持一样。你可以通过传递第三个参数给Zend_Validate_Hostname构造器来禁止TLD校验。在下面的例子中,我们通过第二个参数来支持IDN校验。
<?php $validator = new Zend_Validate_Hostname(Zend_Validate_Hostname::ALLOW_DNS, true, false);
另外,你可以通过传递 TRUE 或 FALSE 给
$validator->setValidateTld()
来激活或禁止 TLD 校验。
请注意只有当你允许DNS主机名被校验,TLDs才能被校验。
46.2.13. InArray
当且仅当一个"needle"$value
包含在一个"haystack"数组,返回 true
。如果精确选项是true
,那么$value
的类型也被检查。
46.2.14. 整数
当且仅当$value
是一个有效的整数,返回 true
。
46.2.15. Ip
当且仅当$value
是一个有效的IP地址,返回 true
。
46.2.16. LessThan
当且仅当$value
小于最大值,返回 true
。
46.2.17. NotEmpty
当且仅当$value
非空,返回 true
。
46.2.18. Regex
当且仅当$value
匹配一个正则表达式,返回 true
。
46.2.19. StringLength
当且仅当字串长度值$value
至少是最小值并不大于最大值(当max选项不是null
),返回 true
。从1.5.0版开始,如果最小长度被设置为一个大于已设定的最大长度的值,setMin()
方法抛出一个异常,并且如果最大长度值被设置为小于一个已设定的最小长度的值,setMax()
方法抛出一个异常。从1.0.2版开始,基于iconv.internal_encoding
的当前值,这个类支持UTF-8和其它字符编码。