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

标签 php zend-framework filtering

我尝试了 PHP 的内置函数:filter_input()

var_dump(filter_var('john.doe.@gmail.com', FILTER_VALIDATE_EMAIL));

输出:

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";
    }
}

输出:

'john.doe.' can not be matched against dot-atom format
'john.doe.' can not be matched against quoted-string format
'john.doe.' is no valid local part for email address 'john.doe.@gmail.com'

内置函数应返回 FALSE 或 Zend 方法“确定”。

我的问题是:
哪个是对的?

最佳答案

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)) {

看起来他们确实严格遵守这一点 - 所以本地部分不能以点开头或结尾。

上面的模式与 rfc2822 规范中的模式完全相同:http://www.ietf.org/rfc/rfc2822.txt - Zend/Validate/EmailAddress.php 中的 isValid 文档 block 将其引用为使用 2822。

所以,如果你想符合 rfc2822,Zend_Validate_EmailAddress 做对了,而且 filter_input 很可能做的不符合规范。

关于php - PHP 内置的 filter_input 是否正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5093348/

相关文章:

php - Doctrine中如何基于动态变量进行动态关联?

javascript - jQuery 数据表 : Combining column visibility with individual column filters (text inputs)?

c# - 招摇发送空值

php - 是否有适用于 Microsoft Word 的嵌入式可视化 (PHP) 解析器?

带有 SSL 证书的 PHP SOAP 客户端

php - 数组总和给出错误的值 PHP

php - 从 Zend_Controller_Request 获取路由信息

php - 在 PHP 库中集成事件调度程序的最佳方式是什么?

java - PrimeFaces,数据表过滤 + Ajax 表更新的问题

php - 使用 === '' 检查空字符串不起作用