Laravel/メールアドレスのバリデーション例(セミコロン区切りで複数の場合)

更新日 5日前(Asia/Tokyo) 更新者: y963@rogarithm

Laravelメールアドレスのバリデーション例(セミコロン区切りで複数の場合)

app/Rules/ValidEmailList.php
<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class ValidEmailList implements Rule
{
    protected $invalidEmail = null;
    public function passes($attribute, $value)
    {
        $emails = array_map('trim', explode(';', $value));

        $this->invalidEmail = null;
        
        // 区切り文字のみ
        if(preg_match("/^;+$/", str_replace(" ", "", $value))) {   
            return false;
        }

        // ブランクなら許可
        if(implode("", $emails) === "") {
            return true;
        }
        
        foreach ($emails as $email) {
            if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
                $this->invalidEmail = $email;
                return false;
            }
        }

        return true;
    }

    public function message()
    {
        $targetEmailAddress = $this->invalidEmail;
        if($this->invalidEmail == "" || is_null($this->invalidEmail)) {
            $targetEmailAddress = "(empty)";
        }
        return "Mail address format is invalid: {$targetEmailAddress}";
    }
}
app/Rules/UniqueEmailList.php
<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class UniqueEmailList implements Rule
{
    protected $duplicateEmail = null;

    public function passes($attribute, $value)
    {
        $emails = array_map('trim', explode(';', $value));
        $normalized = array_map('strtolower', $emails);
        $duplicates = array_diff_key($normalized, array_unique($normalized));

        if (!empty($duplicates)) {
            $this->duplicateEmail = $emails[array_keys($duplicates)[0]];
            return false;
        }

        return true;
    }

    public function message()
    {
        $targetEmailAddress = $this->duplicateEmail;
        if($this->duplicateEmail == "" || is_null($this->duplicateEmail)) {
            $targetEmailAddress = "(empty)";
        }

        return "There are duplicate email addresses: {$targetEmailAddress}";
    }
}

実際のルールの適用方法

use App\Rules\ValidEmailList;
use App\Rules\UniqueEmailList;

...コントローラ...
    $rules = [
        'email' => [new ValidEmailList(), new UniqueEmailList(), その他のルール],
    ];
    $this->validate($request, $rules);
パス: Laravel/メールアドレスのバリデーション例(セミコロン区切りで複数の場合).md
最終更新: 2025-11-30 21:46:04(Asia/Tokyo)