Laravel API请求体中如何验证身份证18位格式及校验码正确性?
- 内容介绍
- 文章标签
- 相关推荐
本文共计880个文字,预计阅读时间需要4分钟。
身份证明字段的长度不能仅依靠长度判断,必须验证前17位数字与第18位校验码的组合逻辑。Laravel 自带的 digits:18 规则会漏掉字母X和校验逻辑,直接导致错误数据入库。
推荐用 Rule::regex() 写精准正则,覆盖:17位数字 + 末位数字或X(大小写都接受):
use Illuminate\Validation\Rule; <p>$rules = [ 'id_card' => [ 'required', 'string', Rule::regex('/^\d{17}[\dXx]$/'), ], ];
- 必须加
string类型约束,否则数字开头的ID会被自动转成int,触发类型不匹配失败 - 正则末尾用
[\dXx]而不是[0-9Xx],避免某些PHP版本下字符类解析差异 - 不要用
alpha_num,它允许纯数字但不校验位数,且放行非法字母
手写校验码算法验证必须放在自定义规则里
正则只能拦住明显格式错误,真正决定合法性的,是第18位校验码是否由前17位加权模11算出。这个逻辑没法用内置规则表达,必须封装成自定义验证规则。
本文共计880个文字,预计阅读时间需要4分钟。
身份证明字段的长度不能仅依靠长度判断,必须验证前17位数字与第18位校验码的组合逻辑。Laravel 自带的 digits:18 规则会漏掉字母X和校验逻辑,直接导致错误数据入库。
推荐用 Rule::regex() 写精准正则,覆盖:17位数字 + 末位数字或X(大小写都接受):
use Illuminate\Validation\Rule; <p>$rules = [ 'id_card' => [ 'required', 'string', Rule::regex('/^\d{17}[\dXx]$/'), ], ];
- 必须加
string类型约束,否则数字开头的ID会被自动转成int,触发类型不匹配失败 - 正则末尾用
[\dXx]而不是[0-9Xx],避免某些PHP版本下字符类解析差异 - 不要用
alpha_num,它允许纯数字但不校验位数,且放行非法字母
手写校验码算法验证必须放在自定义规则里
正则只能拦住明显格式错误,真正决定合法性的,是第18位校验码是否由前17位加权模11算出。这个逻辑没法用内置规则表达,必须封装成自定义验证规则。

