Фильтрация адресов электронной почты в массиве -php - PullRequest
0 голосов
/ 21 января 2010

У меня есть массив php, содержащий адреса электронной почты в виде массива (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?

спасибо.

Ответы [ 6 ]

1 голос
/ 21 января 2010

Поскольку вы используете электронные письма в качестве массива ключей , вы не можете использовать array_filter и filter_var напрямую. Вам нужно написать функцию callback , которую вы можете передать array_filter, которая работает с массивом keys вместо values ​​; в этом случае вы также можете придерживаться своего решения foreach.

Обратите внимание, что me@the.foo и mary@had.a.little.la.mb считаются действительными по filter_var, поскольку он будет проверять только синтаксис, а не семантику.

1 голос
/ 21 января 2010

Если возможно, используйте проверку 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";
        }
    }
}

Попробуйте это:)

0 голосов
/ 01 июня 2016

Вы можете использовать это:

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

Но как писал @ Гордон

Обратите внимание, что me_the.foo и mary@had.a.little.la.mb оба считаются действительными filter_var, потому что он будет проверять только синтаксис, а не семантику.

Итак, вы можете проверить синтаксис, но вы должны сделать некоторую проверку валидатора для этого. Например. Zend2 / Symfony2 или Laravel Validators?

* Вы также можете проверить домен: email

    list($name, $emailDomain) = explode('@', $email);
    unset($name);
    if (!checkdnsrr($emailDomain, 'MX')) {
        return false;
    }
0 голосов
/ 21 января 2010

Это потребует всевозможного непонятного использования вложенных функций, как в ответе Арха. Я думаю, что для удобства обслуживания вам лучше просто использовать цикл. foreach - это действительно отличный способ добавить немного больше семантического значения в код с использованием итераторов.

0 голосов
/ 21 января 2010

Вы также можете использовать 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 голосов
/ 21 января 2010

Вы можете создать свою собственную функцию filter_email ($ email), которая просто вызывает filter_var ($ email, FILTER_VALIDATE_EMAIL).

Имейте в виду, что эта проверка только подтверждает, что адрес электронной почты имеет действительный формат, а не то, что он действителен.

...