PHP的内置filter_input是否正常工作?

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'.

我的中心问题是:
哪一个是对的?

Jus*_*tin 2

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 做得不符合规范。