繁体   English   中英

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

[英]Filtering email addresses in an array -php

我有一个包含电子邮件地址的php数组,格式为array(email_address1 => name1,email2 => name2)格式。

我需要检查电子邮件是否有效,我可以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?

谢谢。

如果可能,请使用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";
        }
    }
}

试试看:)

由于将电子邮件用作数组 ,因此不能直接一起使用array_filterfilter_var 您必须编写一个回调函数,您可以将其传递给对数组键(而不是值)进行操作的array_filter 在这种情况下,您也可以坚持使用foreach解决方案。

请注意, filter_var认为me@the.foomary@had.a.little.la.mb都是有效的,因为它只会测试语法而不是语义。

您可以创建自己的函数filter_email($ email),该函数仅调用filter_var($ email,FILTER_VALIDATE_EMAIL)。

请记住,此检查仅确认电子邮件地址具有有效格式,而不是有效格式。

您也可以使用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 :返回第一个参数的所有值,该键对应于其他参数之一的键

这将需要对嵌套函数的各种模糊使用,就像Arkh的回答一样。 从可维护性的角度来看,我认为最好只使用循环。 foreach是一种非常好的方法,可以为涉及迭代器的代码添加更多的语义含义。

您可以使用此:

return array_filter(array_map('trim', $emails), function ($email) {
           return (filter_var($email, FILTER_VALIDATE_EMAIL)) 
               ? true
               : false;
        });

但是正如@戈登写道

请注意,filter_var认为me@the.foo和mary@had.a.little.la.mb都是有效的,因为它只会测试语法而不是语义。

因此,您可以检查语法,但是应该对此进行一些验证器检查。 例如Zend2 / Symfony2或Laravel验证程序?

*您还可以检查以下域: email

    list($name, $emailDomain) = explode('@', $email);
    unset($name);
    if (!checkdnsrr($emailDomain, 'MX')) {
        return false;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM