我正在尝试创建一个函数来从用户输入中获取电子邮件。这封电子邮件应该用逗号分隔,但是众所周知,我们永远不应该信任用户输入,因此他们可能会在电子邮件地址和逗号之间留一个空格,或者在逗号后面没有电子邮件的逗号。
所以我拥有的是:
<?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 就不是最后一封有效的电子邮件。所以这会创建一个额外的空数组位置。
如何使此功能有效?
答案 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_array
和array_filter
结果删除所有false
值。
$email_array = array_map('trim', explode( ',', $user_input ));
$sanitized_array = array_filter(filter_var_array($email_array, FILTER_VALIDATE_EMAIL));