Вопрос: Как проверить правильность формата мексиканского CURP ?
Что такое КУРП? Уникальный ключ реестра населения ( CURP) представляет собой уникальный 18-значный буквенно-цифровой идентификационный код, используемый для официальной идентификации как жителей, так и граждан Мексики, выдаваемый RENAPO .
Он образован из букв имен и фамилий, даты и штата рождения, пола. Кроме того, символ 17 предназначен для предотвращения дублирования, а последний символ представляет собой цифру, которая используется в качестве детектора-корректора ошибок. Синтаксис подробно описан в Нормативной инструкции по присвоению уникального ключа реестра населения ? .
Контекст: меня интересует только проверка того, что ключ может быть действительным. На данный момент меня не интересует, существует ли этот CURP или нет.
Пока что я просто проверяю, что это 18 буквенно-цифровых символов с регулярным выражением:
/^[A-Z\d]{18}$/
но я также заинтересован в том, чтобы учесть, что символы действительны и что контрольная цифра совпадает.
Обычная фраза
Следующие проверки регулярных выражений:
Полная проверка
Я публикую код на JavaScript, чтобы иметь возможность запускать его здесь, но я уверен, что его очень легко перенести на любой другой язык.
Описание
С учетом структуры, с которой формируется CURP:
[A-Z]
(если это другая буква, используется a
X
).[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, оставляю код на случай, если кому-то поможет.
REST API для проверки CURP и получения основной информации о человеке. API является бесплатным (неограниченное количество запросов), быстрым (в среднем задержка 200 мс) и стандартизированным в соответствии с ISO. Дополнительная информация об использовании Почтальона
Пример запроса:
Пример успешного ответа:
Документация
Здесь я оставляю вам способ выполнить его на PHP, чтобы вы создали функцию, которая возвращает true или false, полностью обжаренную в алгоритме, который оставил @Mariano.
Очень важно, чтобы вы использовали
mb_
строковые функции, так как это вызвало у меня головную боль, поскольку я не помнил, что Ñ принимает два символа внутри, строковые функции, которые не используют mb_ в начале, используют позиции на байт, а не на символВы можете проверить CURP и информацию о человеке, используя этот API https://rapidapi.com/acrogenesis/api/curp-renapo .
Например, чтобы использовать его в php, это будет так:
И он вернет вам информацию следующим образом:
Вы можете использовать библиотеку curp , которая находится в NPM .
Если вы не используете npm, добавьте его с таким пакетом .
Функциональный пример:
Еще одна альтернатива, без использования javascript, проверяющая только формат со свойством
pattern
, имеет такую деталь, что мы не можем проверить контрольную цифру.В python можно использовать библиотеку CURPSuite , которая выполняет проверку формата CURP.
Чтобы установить его:
Пример:
После создания объекта CURP вы также можете получить его свойства, если хотите.
Документация.
Отказ от ответственности: я являюсь разработчиком CURPSuite.
Согласно документу, выпущенному SAT , они упоминают на странице 3 следующий шаблон REGEX, который проверяет не содержимое , а только формат текстовой строки :
Однако неверно в предпоследней части
[0-9,AZ]
, которая должна быть такой[0-9,A-Z]
На уровне кода (Java) его проверка может быть примерно такой в классе Utility: