如何用逗号分隔(和消毒)电子邮件?

时间:2016-10-28 15:28:51

标签: php

情节

我正在尝试创建一个函数来从用户输入中获取电子邮件。这封电子邮件应该用逗号分隔,但是众所周知,我们永远不应该信任用户输入,因此他们可能会在电子邮件地址和逗号之间留一个空格,或者在逗号后面没有电子邮件的逗号。

目标

  1. 从用户输入中获取电子邮件。
  2. 获取此电子邮件列表,清理它们,并将它们保存在一个数组中。
  3. 用户输入证明(他们甚至可以在任何位置放置20个逗号,但它们之间没有电子邮件,但这不会创建数组位置。)
  4. 我的菜鸟尝试

    所以我拥有的是:

    <?php
    $user_input = 'so@godsnetwork.com, you@are.com,great@people.com, thank@you.io,,email.com,';
    $email_array = explode( ',', $user_input );
    
    $sanitized_email_string = '';
    $last = end( $email_array );
    
    foreach ($email_array as $i => $email) {
        $email = sanitize_email( $email ); // Returns an empty string if is not a valid email
    
        if ( $email )
            $sanitized_email_string .= $email . ( ( $last === $i ) ? '' : ',' );
    }
    
    $sanitized_array = explode( ',', $sanitized_email_string );
    

    但我的问题是,正如我上面提到的,如果用户在逗号之间没有电子邮件,那么数组的真正 end 就不是最后一封有效的电子邮件。所以这会创建一个额外的空数组位置。

    如何使此功能有效?

3 个答案:

答案 0 :(得分:2)

忽略电子邮件业务。你拿一根绳子。您将explode()字符串放入数组中。然后,您构建一个新字符串...然后再explode()。为什么这么浪费资源呢?首先构建一个数组:

$valid_emails = array();
foreach ($email_array as $i => $email) {
    $email = sanitize_email( $email );
    if ($email) {
        $valid_emails[] = $email;
    }
}

如果电子邮件无效,则不会将其推入阵列。

答案 1 :(得分:1)

您可以在初次爆炸后立即使用array_filter清理阵列。如下:

$email_array = explode( ',', $user_input );
$sanitized_array = array_filter( $email_array, 'sanitize_email' );

答案 2 :(得分:1)

您可以使用filter_var_arrayarray_filter结果删除所有false值。

$email_array = array_map('trim', explode( ',', $user_input ));
$sanitized_array = array_filter(filter_var_array($email_array, FILTER_VALIDATE_EMAIL));