Laravel电子邮件验证问题

时间:2017-10-20 08:42:29

标签: laravel validation laravel-5

默认的Laravel Validation类允许奇怪的电子邮件。以下是我定义的验证规则:

return Validation::make($data, [
        'email' => 'required|string|email|max:100|unique:customers,email'
]);

当我尝试使用一些奇怪的电子邮件时: aaaa?#%&'@şğüçi̇ö.com它通过了验证。但是,在插入数据库之前,电子邮件中的非拉丁字符将被转换。因此,数据库中的电子邮件地址与原始电子邮件地址不匹配。

为了防止这种情况,我想禁止在@符号后使用非拉丁字符。我尝试了自定义规则:

public function passes($attribute, $value)
{
    return filter_var($value, FILTER_VALIDATE_EMAIL) 
    && preg_match('/@.+\./', $value);
}

但它不起作用。在这方面得到一些帮助会很好。

修改1 谢谢你的回复!但显然,自定义验证器没有采取行动的原因是Laravel在任何操作之前清理所有输入数据。这就是为什么在它转换非拉丁字符之后,preg_replace()一直返回1,因为输入中没有非拉丁字符。首先,我需要找到一个解决方案,并防止Laravel消毒输入。

1 个答案:

答案 0 :(得分:1)

根据您的问题,我了解到您已经创建了自定义验证规则并将其用作

...
'email' => [
    'required',
    'string',
    ...
    new ValidateLatinEmail()
]

正如您所见here,您的RegEx是该验证的问题

这个应该有效:

public function passes($attribute, $value)
{
    return filter_var($value, FILTER_VALIDATE_EMAIL) 
        && preg_match('/@[\x00-\x7F]*\./', $value);
}