我在 Laravel 中使用验证规则,并尝试检查数字中的字符数。
这是我的尝试:
protected static $rules = [
'zip_code' => 'required|size:5|integer'
];
不幸的是,检查邮政编码是数字 5 而不是邮政编码是 5 个字符。无论实际数字如何,我需要设置哪些规则来检查邮政编码是否正好是 5 个字符?
我在 Laravel 中使用验证规则,并尝试检查数字中的字符数。
这是我的尝试:
protected static $rules = [
'zip_code' => 'required|size:5|integer'
];
不幸的是,检查邮政编码是数字 5 而不是邮政编码是 5 个字符。无论实际数字如何,我需要设置哪些规则来检查邮政编码是否正好是 5 个字符?
邮政编码长 5 位,可能包含前导零(美国东北部)。Laravel“数字”检查会删除前导零,因此您需要使用正则表达式模式:
protected static $rules = [
'zip_code' => 'required|regex:/\b\d{5}\b/'
];
这将确保邮政编码始终为 5 位数字。Laravel 文档中的更多详细信息
根据 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)而不是整数作为邮政编码,因为:
您不能在 MySQL 中定义整数的大小,但可以为 varchar 定义。
邮政编码可以是 10 个字符长,带有扩展名(zip+4,例如:12345-1234)。
我希望它有帮助
上面的正则表达式\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-56789
or123456789
等。
然后像这样处理它:
$zip = explode('-', $request->input('zip_code'));
$zip[0]
会有12345
,这是拉链。
$zip[1]
会有6789
,这是+4。
验证任一(Zip 或 Zip + 4)
或者,假设您想要接受并验证zip或zip+4,具体取决于用户提交的内容。你可以这样做:
protected static $rules = [
'zip_code' => 'required|regex:/^\d{5}(?:-\d{4})?$/'
];
这会让其他任何事情都失败12345
。12345-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
}
你在 size:5 上弄错了,试试 min:5|max:5