2010-01-21 57 views
0

我有一个包含电子邮件地址作为数组(email_address1 => name1,email2 => name2)格式的php数组。在一个阵列中过滤电子邮件地址-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

你真的不应该使用FILTER_VALIDATE_EMAIL - 它返回由RFC 3696多家* VALID *电子邮件地址无效,你可以得到一个脚本哪些不会失败@ http://www.linuxjournal.com/article/9585 – Erik 2010-01-23 20:28:37

回答

1

由于您使用的电子邮件作为阵列,你不能直接使用起来array_filterfilter_var。您必须编写回调函数,您可以将其传递给array_filter,该函数在阵列上运行而不是;在这种情况下,您可以坚持使用您的foreach解决方案。

注意[email protected][email protected]都被认为有效通过filter_var,因为它只会考试的语法和语义不。

0

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

请记住,此检查只是确认电子邮件地址有一个有效的格式,而不是它是有效的。

1

如果可能的话使用DNS/MX验证。也许考虑使用一个类呢?一个很好的选择将是http://framework.zend.com/manual/en/zend.validate.set.html#zend.validate.set.email_address

$emails = array(
    '[email protected]' => "user from beyond", 
    'lalala' => "Lala user", 
    '[email protected]' => "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"; 
     } 
    } 
} 

试一下:)

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:返回来自第一个参数的所有值,这个键与其他参数中的一个键相对应

0

这需要嵌套函数的各种模糊使用,就像在Arkh的答案中一样。为了可维护性目的,我认为你最好使用循环。 foreach是向涉及迭代器的代码添加更多语义的真正好方法。

+0

晦涩?这些函数每次检查数组部分中的php文档时都会尖叫“链接我们”。 但是,是不是真正可维护和foreach看起来更多的逻辑。 – Arkh 2010-01-21 14:57:25

+1

当然,但所有这些功能都是屏蔽代码的行为,这是一个循环。 'array_map'对于快速构建原型和编写精益代码非常适用,但是对具有多个不同函数返回值作为其参数的'array_map'调用进行解码,所有操作相同的数据源都是不可读的。 – 2010-01-21 15:20:58

0

您可以使用此:

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

但作为@Gordon写道

注意[email protected][email protected]都被认为是有效的通过filter_var,因为它只会测试语法而不是语义。

所以,你可以检查语法,但你应该做一些验证检查。例如。 Zend2/Symfony2或Laravel验证器?

*您也可以查询的域名:email

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