【问题标题】:How to check comma separated email addresses with regex如何使用正则表达式检查逗号分隔的电子邮件地址
【发布时间】:2017-01-13 07:47:45
【问题描述】:

我想在Laravel 5.1 验证中使用regex 检查逗号分隔的电子邮件地址,并且我在regex 下方创建了电子邮件地址,但它不适用于我。

regex: /^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/i

我想允许这样的电子邮件:test1test.com, test2@test.com, test3@test.com

这是我的验证示例代码:

$rules = array(
    'email' => 'regex:/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/i',
);
$messages = [
    'email.regex' => 'Please enter valid Email.',
];

$validator = Validator::make(Input::all(), $rules, $messages);

if ($validator->fails()) {

} else {

}

【问题讨论】:

  • stackoverflow.com/questions/4412725/…。你可以使用这种方法(^( + 你的正则表达式 + ,?)+$)或者使用更像 PCRE 的东西 /^([_a-z0-9-]+(?:\.[_a-z0-9-]+)*@[a-z0-9-]+(?:\.[a-z0-9-]+)*\.[a-z]{2,3})(?:,(?1))*$/i
  • 电子邮件并不是那么容易验证:hexillion.com/samples
  • 电子邮件地址中不允许使用逗号,因此您也可以在逗号上展开,修剪结果并使用filter_var() 单独检查每个条目。
  • 为什么不用逗号分解字符串并通过内置的 laravel 电子邮件验证器规则验证每个元素?
  • 不是使用explode并在foreach中检查它们的选项吗?

标签: php regex laravel validation


【解决方案1】:

你可以试试这个

foreach(explode(',', $sEmailAddresses) AS $sEmailAddress) {
$bValid |= filter_var($sEmailAddress, FILTER_VALIDATE_EMAIL);
 }

 $sResult = ($bValid) ? 'Both are valid' : 'One of them are not';

【讨论】:

  • 不要在foreach中使用explode,先添加到变量中。在 foreach 中使用函数对性能不利
  • 您还需要修剪各个字符串,因为前导或结尾空格会使电子邮件地址无效。
  • @PaulRoefs 为什么? explode 执行一次。
  • 我注意到的另一件事是,当两者都无效时,这可能会给出“其中一个不是”
【解决方案2】:

这是java脚本验证

 var emails='test1test.com,test2@test.com,test3@test.com'; 
    var regex = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/;
     var result = emails.replace(/\s/g, "").split(",");  
                    for(var i = 0;i < result.length;i++) {
                        if(!regex.test(result[i])) {
                            return false;
                        }
                    }      

【讨论】:

    【解决方案3】:

    您可以使用Request 类的replace() 方法将输入转换为包含电子邮件地址的数组,然后对其进行数组验证:

    // Split form input value on commas followed by any number of spaces (returns an array)
    $request->replace(array('email' => preg_split('~, *~', $request->email)));
    // How we should define our validator rule
    $validator = Validator::make($request->all(), [
        'email.*' => 'email',
    ]);
    // Turn back to our first value
    $request->email = implode(', ', $request->email);
    

    【讨论】:

      【解决方案4】:

      试试这个,

      /^([_a-z0-9\-]+)(\.[_a-z0-9\-]+)*@([a-z0-9\-]{2,}\.)*([a-z]{2,4})(,([_a-z0-9\-]+)(\.[_a-z0-9\-]+)*@([a-z0-9\-]{2,}\.)*([a-z]{2,4}))*$/
      

      验证您的电子邮件正则表达式。

      【讨论】:

        【解决方案5】:

        回复@Alex Andrei 的评论:

        您将在下面找到我用来获取您正在寻找的结果的函数示例,该函数使用 PHP explode() 来分隔电子邮件。显然,为了获得您需要的确切功能,您应该真正深入研究该文档:)

        public function validateEmail()
            {
                $emails = "john@email.com,jack@email.com,notanemail,jill@email.com";
                $explodedEmails = explode(",", $emails);
        
        
                foreach ($explodedEmails as $email)
                {
                    $validator = \Validator::make(
                        array('individualEmail' => $email),
                        array('individualEmail' => 'email') 
                    );
        
                    if ($validator->passes())
                    {
                        echo "Email correct <br />";
                    }
                    elseif($validator->fails())
                    {
                        echo "Email not correct <br />";
        
                    }
        
                };
        
            }
        

        这呼应了:

        Email correct 
        Email correct 
        Email not correct 
        Email correct 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-20
          • 1970-01-01
          • 2017-10-25
          • 2014-06-22
          相关资源
          最近更新 更多