Laravel电子邮件验证问题

问题描述:

默认Laravel验证类允许使用奇怪的电子邮件。这里是我所定义的验证规则:Laravel电子邮件验证问题

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消毒输入。

+0

什么只是'回报filter_var($值,FILTER_VALIDATE_EMAIL);'在passes方法? – Maraboc

从你的问题我知道你已经创建了一个自定义的验证规则,并使用它像

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

正如你可以看到here,你的正则表达式是与验证问题

这一个应该工作:

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