Laravel 6中如何验证两种格式的userNo字符串?
解决Laravel 6中userNo的验证问题
问题核心错误分析
你之前的验证代码存在几个关键问题:
- 正则表达式逻辑错误:
- 合并正则时用了
[503|504]字符组,这只会匹配单个字符(5、0、3、|、4),而非503或504完整前缀。 - 原有正则
^(\b[503])([0-9]{9})$不符合需求:[503]允许以5、0、3任意单个字符开头,且总长度为1+9=10位,并非严格的“503开头10位”;新增规则的正则错误设置了[0-9]{9},导致总长度为3+9=12位,与“504开头9位”的要求不符。
- 合并正则时用了
- 分支判断字段错误:if-else中误将
telephone作为判断字段,实际应该用userNo。
解决方案
方案一:合并正则验证(推荐,代码更简洁)
直接用正则分支匹配两种合法格式:
$validator = Validator::make($data, [ 'userNo' => 'required|regex:/^(503\d{7}|504\d{6})$/' ]);
正则说明:
^503\d{7}$:匹配503开头,后续7位数字的10位字符串(如5031234567)^504\d{6}$:匹配504开头,后续6位数字的9位字符串(如504123456)|:表示两种格式二选一
如果需要自定义更清晰的错误提示,可添加错误消息:
$validator = Validator::make($data, [ 'userNo' => 'required|regex:/^(503\d{7}|504\d{6})$/' ], [ 'userNo.regex' => 'userNo格式错误,需为以503开头的10位数字或以504开头的9位数字' ]);
方案二:修正分支验证逻辑
若坚持用分支判断,需纠正字段名和正则:
$userNo = $data['userNo'] ?? ''; if (substr($userNo, 0, 3) == '504') { $validator = Validator::make($data, [ 'userNo' => 'required|regex:/^504\d{6}$/' ]); } else { $validator = Validator::make($data, [ 'userNo' => 'required|regex:/^503\d{7}$/' ]); }
验证失败响应(保留原有逻辑即可)
if ($validator->fails()) { return response()->json([ 'ResultCode' => 4005, 'Detail' => $validator->errors() ], 401); }
内容的提问来源于stack exchange,提问作者Yang
相关产品推荐
相关产品推荐

