过滤数组-php中的电子邮件地址

时间:2010-01-21 13:04:28

标签: php array-filter

我有一个包含电子邮件地址为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?

感谢。

6 个答案:

答案 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_filterfilter_var。您必须编写一个回调函数,您可以将其传递给对{em>键而不是进行操作的array_filter ;在这种情况下,您也可以坚持使用foreach解决方案。

请注意me@the.foomary@had.a.little.la.mbfilter_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;
    }