我有一个包含电子邮件地址为php(array_address1 => name1,email2 => name2)格式的php数组。
我需要检查电子邮件是否有效,我可以foreach
和
foreach($arr as $email => $name) {
$new = array();
if(filter_var($email, FILTER_VALIDATE_EMAIL)) {
$new[$email] = $name;
}
return $new;
}
我可以使用array_filter实现上述目的吗?什么是语法??
array_filter($emails_arr, 'filter_var') ?? how about FILTER_VALIDATE_EMAIL parameter?
感谢。
答案 0 :(得分:1)
如果可能,请使用DNS / MX验证。也许考虑使用一个类?一个不错的选择是http://framework.zend.com/manual/en/zend.validate.set.html#zend.validate.set.email_address
$emails = array(
'me@the.re' => "user from beyond",
'lalala' => "Lala user",
'mary@had.a.little.la.mb' => "Mary with lamb"
);
$validator = new Zend_Validate_EmailAddress(
Zend_Validate_Hostname::ALLOW_DNS |
Zend_Validate_Hostname::ALLOW_LOCAL,
true); // enable DNS checking and lastly enable MX checking
foreach($emails as $email => $name){
if ($validator->isValid($email)) {
$validEmails[$email] => $name
} else {
foreach ($validator->getMessages() as $message) {
echo "$message\n";
}
}
}
试试:)
答案 1 :(得分:1)
由于您将电子邮件用作阵列密钥,因此您无法直接使用array_filter
和filter_var
。您必须编写一个回调函数,您可以将其传递给对{em>键而不是值进行操作的array_filter
;在这种情况下,您也可以坚持使用foreach
解决方案。
请注意me@the.foo
和mary@had.a.little.la.mb
被filter_var
视为有效,因为它只会测试语法而非语义。
答案 2 :(得分:0)
您可以创建自己的函数filter_email($ email),只调用filter_var($ email,FILTER_VALIDATE_EMAIL)。
请注意,此检查只是确认电子邮件地址的格式有效,而不是有效格式。
答案 3 :(得分:0)
您也可以使用filter_var_array:
$result = array_intersect_key($arr, array_fill_keys(filter_var_array(array_keys($arr), FILTER_VALIDATE_EMAIL), ''));
array_keys:获取一个包含输入所有键的数组
filter_var_array:过滤值数组
array_fill_keys:创建一个数组,其中键是第一个输入数组的值,值是第二个参数
array_intersect_key:返回第一个参数中的所有值,该键对应于其他参数之一的键
答案 4 :(得分:0)
这需要各种模糊的嵌套函数使用,比如Arkh的回答。我认为出于可维护性的目的,你最好只使用一个循环。 foreach
是一种非常好的方法,可以为涉及迭代器的代码添加更多的语义含义。
答案 5 :(得分:0)
您可以使用:
return array_filter(array_map('trim', $emails), function ($email) {
return (filter_var($email, FILTER_VALIDATE_EMAIL))
? true
: false;
});
但正如@Gordon写的那样
请注意,filter @ var认为me@the.foo和mary@had.a.little.la.mb都有效,因为它只会测试语法而不是语义。
因此,您可以检查语法,但是您应该对此进行一些验证器检查。例如。 Zend2 / Symfony2或Laravel Validators?
*您还可以查看以下域名: email
list($name, $emailDomain) = explode('@', $email);
unset($name);
if (!checkdnsrr($emailDomain, 'MX')) {
return false;
}