10

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

这是我的尝试:

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

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

4

4 回答 4

19

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

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

这将确保邮政编码始终为 5 位数字。Laravel 文档中的更多详细信息

于 2015-02-10T23:39:29.950 回答
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进行验证。在引导功能下的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)。

我希望它有帮助

于 2017-01-04T08:05:25.477 回答
0

上面的正则表达式\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-56789or123456789等​​。

然后像这样处理它:

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

$zip[0]会有12345,这是拉链。

$zip[1]会有6789,这是+4。


验证任一(Zip 或 Zip + 4)

或者,假设您想要接受并验证zipzip+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
}
于 2021-06-18T17:26:07.240 回答
-3

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

于 2016-04-16T20:50:31.567 回答