【问题标题】:How to allow more characters in the validation of an email field?如何在验证电子邮件字段时允许更多字符?
【发布时间】:2019-04-06 02:27:24
【问题描述】:

我在 Laravel 5.4 中验证电子邮件长度时遇到问题。 在迁移中,我默认创建了电子邮件字段,并且在 DB 中以 varchar (191) utf8mb4_unicode_ci 正确完成。 在前端验证没有问题,但在后端最多只能允许 73 个字符。

在控制器中保存和更新方法,我试过了:

$this->validate($request, [
    // ...
    'email' => 'nullable|email',
    // ....
]);
$this->validate($request, [
    // ...
    'email' => 'nullable|email|max:191',
    // ....
]);

查看表单输入:

{!! Form::label('email', 'Email:') !!}
{!! Form::email('email', null, ['class' => 'form-control' . ($errors->has('email') ? ' is-invalid' : ''), 'maxlength' => 191]) !!}

@if ($errors->has('email'))
    <span class="invalid-feedback">{{ $errors->first('email') }}</span>
@endif

这通过了验证(73 个字符):
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@test.com

但是这个或更长的,没有通过验证(74 个字符):
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@test.com
(我也尝试了其他字符,不只是 aaa,以防万一它不是没有运气的长度)

我做错了什么?

【问题讨论】:

    标签: laravel validation


    【解决方案1】:

    电子邮件的 RFC 规范以及在技术上有效的内容。

    1. 电子邮件地址由本地部分和域组成,由 @ 字符分隔 (RFC 2822 3.4.1)。
    2. 本地部分可以由字母和数字字符以及以下字符组成:!、#、$、%、&、'、*、+、-、/、=、?、^、_、`、{ 、|、} 和 ~,可能带有点分隔符 (.),在内部,但不在开头、结尾或另一个点分隔符旁边 (RFC2822 3.2.4)。
    3. 本地部分可能包含带引号的字符串,即引号 (") 内的任何内容,包括空格 (RFC 2822 3.2.5)。
    4. 带引号的对(例如 @)是本地部分的有效组件,尽管是 RFC 822 (RFC 2822 4.4) 中的过时形式。
    5. 本地部分的最大长度为 64 个字符 (RFC 2821 4.5.3.1)。
    6. 域由由点分隔符分隔的标签组成 (RFC1035 2.3.1)。
    7. 域标签以字母字符开头,后跟零个或多个字母字符、数字字符或连字符 (-),以字母或数字字符结尾 (RFC 1035 2.3.1)。
    8. 标签的最大长度为 63 个字符 (RFC 1035 2.3.1)。
    9. 域的最大长度为 255 个字符 (RFC 2821 4.5.3.1)。
    10. 域必须完全限定并且可解析为 A 类或 MX 类 DNS 地址记录 (RFC 2821 3.6)。

    因此,总而言之,如果您想使用更长的邮件,您应该添加您的自定义电子邮件规则,这将避免一些此类检查。

    【讨论】:

    • 啊!是的,这是本地部分的长度。请注意,由于某种原因,Laravel 最多可以验证 74 个字符,而不是标准所说的最多 64 个字符。我还测试了域部分,并按照标准允许每个标签最多 63 个。我只有 191 的总域部分不接触数据库。谢谢@nakov!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-06
    • 2015-06-20
    • 2012-04-08
    • 2011-03-06
    • 2022-01-07
    • 1970-01-01
    相关资源
    最近更新 更多