\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 或123456789 等通过。
然后像这样处理它:
$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})?$/'
];
这会让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
}