php 8.3 中验证身份证号需先用正则 /^[1-9]\d{16}[\dxx]$/ 快速筛选,再通过加权求和取模匹配校验码表 ['1','0','x','9','8','7','6','5','4','3','2'] 严格验证第18位。

PHP 8.3 中匹配身份证号码,核心是用正则表达式进行字符串搜索,而不是依赖过时的 ereg 或模糊匹配。中国身份证号有明确规则:18位,前17位为数字,第18位是数字或字母 X(不区分大小写),且需满足校验码算法(非单纯格式校验)。
只做基础格式匹配(快速筛选)
若只需判断是否符合长度和字符范围(比如日志中粗筛疑似身份证),可用 preg_match():
- 正则:
/^[1-9]\d{16}[\dXx]$/ - 说明:开头不能为 0(地址码第一位非零),共17位数字 + 第18位数字或 X/x
- 示例:
preg_match('/^[1-9]\d{16}[\dXx]$/', $str)返回 1 表示匹配
执行完整校验(推荐用于注册、实名等关键场景)
仅格式合法不够,必须验证第18位校验码是否正确。PHP 8.3 支持现代语法,可封装一个校验函数:
- 提取前17位,按权重表(
[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2])加权求和 - 对 11 取模,得到余数,查校验码表
['1','0','X','9','8','7','6','5','4','3','2'] - 第18位需与查表结果一致(注意 'X' 不区分大小写)
实际使用建议
不要在敏感操作中跳过校验码验证。例如用户提交表单时:
- 先用正则快速过滤明显非法字符串(如含中文、空格、长度不对)
- 再调用校验函数确认合法性,失败则返回明确提示(如“身份证号码不合法”)
- 注意:身份证可能有全角字符或不可见空格,建议提前用
trim()和str_replace([' ', ' '], '', $id)清理
小提醒
PHP 8.3 已移除所有已废弃的正则函数(如 split()),务必使用 preg_* 系列;校验逻辑无需扩展支持,纯 PHP 即可实现;线上环境建议将校验逻辑抽成独立方法,便于复用和单元测试。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











