【问题标题】:PHP - email validation failsPHP - 电子邮件验证失败
【发布时间】:2026-01-18 00:35:01
【问题描述】:

从多行文本字段中,我得到了几个用换行符分隔的电子邮件地址。字段值作为 JSON 字符串存储在数据库中:

{"admin_emails":"email1@domain.com\r\nemail2@domain.com"}

然后我使用json_decodeexplode 解码电子邮件:

$emailStr = json_decode($stringFromDb)->admin_emails; 
$emails = explode("\r\n", str_replace("\r", "\r\n", $emailStr) ); 

接下来,对于表格中的每封电子邮件,我都会检查它是否有效并做一些事情:

foreach( $emails as $email )
{
    if( filter_var($email, FILTER_VALIDATE_EMAIL) ){
        // do stuff with email
    }
}

但我有以下问题:filter_val 仅将第一封电子邮件识别为有效的电子邮件地址。所有后续电子邮件都将被过滤掉。是什么原因导致这些电子邮件未被识别为有效的电子邮件地址?

【问题讨论】:

  • 您可能希望在 $emailStr 变量上调用 explode 而不是该变量的字符串替换版本。

标签: php json validation email


【解决方案1】:

您似乎正在将 "email1@domain.com\r\nemail2@domain.com" 替换为 "email1@domain.com\r\r\nemail2@domain.com" - 换句话说,\r\r\n。所以第一次之后的所有电子邮件都以换行符开头,因此是无效的。

你可以简单地不把str_replace()放在一起

【讨论】:

  • 是的,我的错。我想在不同的新行格式的情况下确保安全......我有点过头了:D
【解决方案2】:

Maxim 是正确的:

<?php

$s ='{"admin_emails":"email1@domain.com\r\nemail2@domain.com"}';

//Then I decode the emails using json_decode and explode:

$emailStr = json_decode($s)->admin_emails;
$emails = explode("\r\n", $emailStr);

//next, for each email in table, I check if it's valid and do some stuff:

foreach( $emails as $email ) {
    if( filter_var($email, FILTER_VALIDATE_EMAIL) ){
       echo $email." is valid\n\n";
        // do stuff with email
    }
}

这会产生:

email1@domain.com 有效

email2@domain.com 有效

【讨论】: