[英]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_filter
和filter_var
。 您必须编写一个回调函数,您可以将其传递给对数组键(而不是值)进行操作的array_filter
; 在这种情况下,您也可以坚持使用foreach
解决方案。
请注意, filter_var
认为me@the.foo
和mary@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.