我尝试了 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/