use*_*736 5 php filtering zend-framework
我试过PHP的内置函数:filter_input()
var_dump(filter_var('john.doe.@gmail.com', FILTER_VALIDATE_EMAIL));
Run Code Online (Sandbox Code Playgroud)
输出:
string(19)"john.doe.@ gmail.com"
然后我尝试了最新版本的Zend Framework(1.11.3):
$validator = new Zend_Validate_EmailAddress();
if ($validator->isValid('john.doe.@gmail.com')) {
echo 'OK';
} else {
foreach ($validator->getMessages() as $message) {
echo "$message\n";
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
'john.doe.' 不能与点原子格式
'john.doe' 匹配.无法与引号字符串格式
'john.doe' 匹配.对于电子邮件地址'john.doe没有有效的本地部分.@ gmail.com'
内置函数应返回FALSE或Zend方法返回'OK'.
我的中心问题是:
哪一个是对的?
http://framework.zend.com/manual/en/zend.validate.set.html并没有真正表明它们是否受到 RFC 严格,所以让我们看看源代码。
在源代码中,_validateLocalPart() 定义了它们匹配的 EBNF:
// Dot-atom characters are: 1*atext *("." 1*atext)
// atext: ALPHA / DIGIT / and "!", "#", "$", "%", "&", "'", "*",
// "+", "-", "/", "=", "?", "^", "_", "`", "{", "|", "}", "~"
if (preg_match('/^[' . $atext . ']+(\x2e+[' . $atext . ']+)*$/', $this->_localPart)) {
Run Code Online (Sandbox Code Playgroud)
看来他们确实严格遵守这一点 - 所以本地部分不能以点开头或结尾。
上面的模式与 rfc2822 规范中的完全相同:http://www.ietf.org/rfc/rfc2822.txt - Zend/Validate/EmailAddress.php 中的 isValid 文档块将其引用为使用 2822。
因此,如果您想兼容 rfc2822,Zend_Validate_EmailAddress 做得对,而且很可能,filter_input 做得不符合规范。
| 归档时间: |
|
| 查看次数: |
1120 次 |
| 最近记录: |