【问题标题】:In Laravel, what validation rules do I need to check the number of characters in a number?在 Laravel 中,我需要哪些验证规则来检查数字中的字符数?
【发布时间】:2015-04-11 04:53:48
【问题描述】:

我在 Laravel 中使用规则进行验证,并尝试检查数字中的字符数。

这是我的尝试:

protected static $rules = [
    'zip_code' => 'required|size:5|integer'
];

不幸的是,它检查邮政编码是数字 5 而不是邮政编码是 5 个字符。无论实际数字如何,我需要设置哪些规则来检查邮政编码是否正好是 5 个字符?

【问题讨论】:

  • 邮政编码不是整数。整数没有前导零,但某些邮政编码有。

标签: php validation laravel validationrules


【解决方案1】:

\b\d{5}\b 的上述正则表达式使用单词边界并且将通过验证,只要输入中有 5 个分组的数字任何地方。这可能不是大多数人想要的。

例如,如果用户提交Hello 00000 World!,验证将通过,您的控制器将收到字符串Hello 00000 World!,这很可能不是它所期望的,它会哭泣。


验证 5 位数字(邮编)

我建议使用锚点,因为我们想要的只是 5 位数字,并且绝对 什么都没有 可以通过验证并进入控制器。

这样的事情很简单,适用于 5 位数字(邮政编码):

protected static $rules = [
    'zip_code' => 'required|regex:/^\d{5}$/'
];

验证 5 位破折号和 4 位 (Zip + 4)

或者,如果您想验证 Zip+4,即。 12345-6789 格式化的邮政编码,你可以这样做:

protected static $rules = [
    'zip_code' => 'required|regex:/^\d{5}-\d{4}$/'
];

这会让12345-6789 通过,但不会让1234-56789123456789 等通过。

然后像这样处理它:

$zip = explode('-', $request->input('zip_code'));

$zip[0] 将有 12345,即 zip。

$zip[1] 将有 6789,即 +4。


验证任一(Zip 或 Zip + 4)

或者,假设您希望根据用户提交的内容接受并验证 任一 zip 或 zip+4。你可以这样做:

protected static $rules = [
    'zip_code' => 'required|regex:/^\d{5}(?:-\d{4})?$/'
];

这会让1234512345-6789 在其他任何事情上都失败。

然后你可以和上面一样,因为explode仍然可以在这两种变体上工作,但会根据情况构建一个包含一个或两个值的数组。

$zip = explode('-', $request->input('zip_code'));

if (count($zip) > 1) {
    // do some zip+4 stuff
} else {
    // just a zip, lets do zip stuff
}

【讨论】:

    【解决方案2】:

    根据 Laravel 5.3:

    如果您要针对包含数字的 字符字段 进行验证,并且您想知道它是否最多 5 个或更少的数字,那么您可以使用:

    protected static $rules = [
        'zip_code' => 'required|max:5|string'
    ];
    

    如果您要针对 整数字段 进行验证,并且您想知道它是否包含 最多 5 个或更少的数字,请使用:

    protected static $rules = [
        'zip_code' => 'required|max:99999|integer'
    ];
    

    如果您要针对 整数字段 进行验证,并且您想知道它是否包含 精确的 5 位数字,那么您可以使用:

    protected static $rules = [
        'zip_code' => 'required|digits:5|integer'
    ];
    

    虽然在最后一种情况下,带有前导零的邮政编码将被修剪,这就是为什么对于邮政编码,我建议使用 preg_match 进行验证。在 boot 函数下的 AppServiceProvider 文件中定义自定义验证规则。供参考,请参阅:

    https://laravel.com/docs/5.3/validation#custom-validation-rules

    你应该使用 varchar(10)(string,10 in laravel) 而不是整数作为邮政编码,因为:

    1. 您不能在 MySQL 中定义整数的大小,但可以为 varchar 定义。

    2. 邮政编码可以是 10 个字符长,带扩展名(zip+4,例如:12345-1234)。

    希望对你有帮助

    【讨论】:

      【解决方案3】:

      你弄错了 size:5 try min:5|max:5

      【讨论】:

      • 在任何数字字段上使用minmax 将要求该字段介于minmax 之间。例如,如果您设置min:5max:5,则数量只能是五个。如果设置min:3max:10,则数字只能是3-10。见laravel.com/docs/8.x/validation#rule-size
      【解决方案4】:

      邮政编码长度为 5 位,可能包含前导零(美国东北部)。 Laravel“数字”检查会删除前导零,因此您需要使用正则表达式模式:

      protected static $rules = [
           'zip_code' => 'required|regex:/\b\d{5}\b/'
      ];
      

      这将确保邮政编码始终为 5 位数字。更多详情在Laravel Docs

      【讨论】:

      • 这正是我想要的!不知道我是怎么错过的。一定是盯着验证规则太久了。非常感谢你的帮助!你这个男人!
      • 你知道这些规则在代码 Laravel 文件中的位置吗?我很好奇他们用什么 php 代码来确定返回的真/假值。
      • 是的,他们在vendor/laravel/framework/src/Illuminate/Validation/Validator.php。进行验证的方法以validate 开头,因此对于digits 规则,您将找到validateDigits
      猜你喜欢
      • 2015-02-21
      • 2019-08-09
      • 1970-01-01
      • 2020-10-12
      • 2017-09-16
      • 2018-11-02
      • 1970-01-01
      • 2017-06-07
      • 2021-05-12
      相关资源
      最近更新 更多