在Laravel中,我需要什么验证规则来检查一个数字中的字符数?

In Laravel, what validation rules do I need to check the number of characters in a number?

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

这是我的尝试:

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

不幸的是,检查邮政编码是数字 5 而不是邮政编码是 5 个字符。我需要设置哪些规则来检查邮政编码是否恰好是 5 个字符,而不考虑实际数字?

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

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

这将确保邮政编码的长度始终为 5 位数字。 Laravel Docs

中有更多详细信息

你在 size:5 上弄错了,试试 min:5|max:5

根据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 进行验证的邮政编码。在 AppServiceProvider 文件中的 boot 函数下定义自定义验证规则。作为参考,请参阅:

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)。

希望对你有帮助

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

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


验证 5 位数字 (Zip)

我建议使用锚点,因为我们只需要 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
}