问题:如何验证墨西哥CURP的格式是否有效?
什么是 CURP?唯一人口登记密钥 (CURP)是由RENAPO颁发 的唯一 18 个字符的字母数字身份代码,用于正式识别墨西哥居民和公民。
它由姓名和姓氏的字母、出生日期和出生状态以及性别组成。此外,字符 17 是为了避免重复,最后一个字符是用作错误检测器校正器的数字。语法在唯一人口注册表键的分配规范说明中有详细说明?。
上下文:我只对验证密钥是否有效感兴趣。在这一点上,我对 CURP 是否存在不感兴趣。
到目前为止,我只是用正则表达式检查它是 18 个字母数字字符:
/^[A-Z\d]{18}$/
但我也有兴趣考虑字符是否有效,并且校验位匹配。
正则短语
以下正则表达式检查:
全面验证
我用 JavaScript 发布代码以便能够在此处运行它,但我确信它很容易移植到任何其他语言。
描述
考虑到形成 CURP 的结构:
[A-Z]
字母(如果是另一个字母,
X
则使用 a )。[AEIOUX]
(
X
如果没有,则为一个)。[A-Z]{2}
\d{2}
年。(?:0[1-9]|1[0-2])
月。(?:0[1-9]|[12]\d|3[01])
天。[HM]
(?:AS|B[CS]|C[CLMSH]|D[FG]|G[TR]|HG|JC|M[CNS]|N[ETL]|OC|PL|Q[TR]|S[PLR]|T[CSL]|VZ|YN|ZS)
[B-DF-HJ-NP-TV-Z]{3}
[A-Z\d]
(\d)
在查看它是否与正则表达式匹配后,我们检查校验位是否有效。也就是说,如果它与计算出的前 17 个字符匹配:
要计算数字,首先将 17 个字符中每个字符的值相加,这些字符的值按照以下顺序(字典)从 0 到 36:
并取这个和的最后一位数字的 10 的补码(或者
0
如果它给出 10)。我的回答有点晚了,但前段时间我用这种方法来验证个人和法人实体的 RFC。我从 SAT 官方网站获取了正则表达式来验证 RFC。我希望有人觉得它有用。该功能在
JS
非常感谢。这帮助我为 PHP 创建了一个验证器,我留下了代码以防它对某人有所帮助。
用于验证 CURP 并获取有关此人的基本信息的 REST API。API 是免费的(无限请求)、快速(平均延迟 200 毫秒)和根据 ISO 标准化。使用 Postman 的更多信息
请求示例:
成功响应示例:
文档
在这里,我为您提供了一种在 PHP 中执行它的方法,以便您创建一个返回 true 或 false 的函数,该函数在 @Mariano 留下的算法中完全烘焙
使用
mb_
字符串函数非常重要,因为这让我很头疼,因为我不记得 Ñ 在内部使用两个字符,开头不使用 mb_ 的字符串函数使用每个字节的位置,而不是每个字符您可以使用此 API https://rapidapi.com/acrogenesis/api/curp-renapo验证 CURP 和此人的信息。
例如在 php 中使用它会是这样的:
它会像这样将信息返回给您:
您可以使用NPM 中的curp库
如果您不使用 npm,请将其添加到这样的bundle中。
功能示例:
另一种选择,不使用 javascript,仅使用属性验证格式
pattern
,具有我们无法检查校验位的细节。在 python 中,您可以使用执行 CURP 格式验证的CURPSuite库。
要安装它:
例子:
创建 CURP 对象后,您还可以根据需要获取其属性。
文档。
免责声明:我是 CURPSuite 的开发者。
根据SAT 发布的文件,他们在第 3 页提到了以下 REGEX 模式,它不验证内容,而只验证文本字符串的格式:
但是倒数第二部分是不正确的
[0-9,AZ]
,应该是这样的[0-9,A-Z]
在代码级别(Java),它的验证可能在 Utility 类中是这样的: