如何验证表单请求中的日期?day字段补零验证失效问题
解决Day字段严格格式验证问题
嘿,我懂你遇到的这个坑——date_format:"d"这个验证规则其实没你想的那么严格!它底层依赖PHP的DateTime::createFromFormat方法,这个方法会自动把单数字的日期(比如1)补成两位的01,所以输入1的时候会被当成合法值通过验证,但这完全不符合你要的「必须是两位数字、1-9日必须是01-09」的要求。
给你两个靠谱的解决方案:
方案一:用正则表达式严格匹配
直接用正则来限定格式和范围,这是最直接的方式:
'day' => 'required|regex:/^(0[1-9]|[12][0-9]|3[01])$/'
这个正则的逻辑拆解一下:
0[1-9]:匹配01到09的两位数字[12][0-9]:匹配10到29的两位数字3[01]:匹配30和31这两个合法的月末日期
方案二:自定义Laravel验证规则
如果你的项目里经常需要这种验证,可以自定义一个规则,更优雅也更复用:
- 生成自定义规则文件:
php artisan make:rule TwoDigitDay
- 在生成的
TwoDigitDay类的passes方法里写验证逻辑:
public function passes($attribute, $value) { // 首先检查是否是两位数字 if (!preg_match('/^\d{2}$/', $value)) { return false; } // 再检查数值范围在1-31之间 $day = (int)$value; return $day >= 1 && $day <= 31; }
- 然后在验证规则里使用这个自定义规则:
'day' => 'required|app\Rules\TwoDigitDay'
这样就能完全满足你的要求:必须是两位数字,1-9日只能是01-09,范围01-31。
内容的提问来源于stack exchange,提问作者user9719024
相关产品推荐
相关产品推荐

