JS+Regex による ID 番号の検証

Jun 09, 2018 pm 02:06 PM
正規表現 IDカード

今回は、JS+RegexでID番号を確認する場合の注意点を紹介します。実際のケースを見てみましょう。

要するに

ユーザーの実名検証を行う場合、正規表現とID番号の検証スキームがよく使用されます。この記事では 2 つの検証スキームをリストします。プロジェクトの実際の状況に応じて適切なスキームを選択できます。

身分証明書番号の説明

住民票番号、正しく正式な名称は「国民番号」となります。 [中華人民共和国国家標準 GB 11643-1999] の国民識別番号に関する規定によれば、国民識別番号は 17 桁のボディ コードと 1 桁のチェック コードで構成される特徴的な組み合わせコードです。左から右へ、6 桁の住所コード、8 桁の生年月日コード、3 桁のシーケンス コード、1 桁のチェック コードの順です。

北京市朝陽区の女性の ID 番号を例に挙げます。ID 番号の意味は次の図のとおりです。

JS+Regex による ID 番号の検証

注: この ID 番号は国家標準 [GB] に基づいています。 11643-1999]。

ここで、完全な ID 番号認証プロセスを最初から完了します。

オプション 1 (単純)

1.1 分割ルール

1.1.1 住所コードのルール: 住所コードの長さは 6 桁です
数字 1 ~ 9 で始まります
最後の 5 桁は 0 ~ 9数字

上記のルールに従って、住所コードの正規表現を記述します: /^[1-9]d{5}//^[1-9]d{5}/

1.1.2 年份码规则:年份码长4位
以数字18,19或20开头
剩余两位为0-9的数字

根据以上规则,写出年份码的正则表达式: /(18|19|20)d{2}/。如果不需要18开头的年份,可以去掉18。

1.1.3 月份码规则:
月份码长2位
第一位数字为0,第二位数字为1-9
或者第一位数字为1,第二位数字为0-2

根据以上规则,写出月份码的正则表达式: /((0[1-9])|(1[0-2]))/

1.1.4 日期码规则:
日期码长2位
第一位数字为0-2,第二位数字为1-9
或者是10,20,30,31

根据以上规则,写出日期码的正则表达式 :/(([0-2][1-9])|10|20|30|31)/

1.1.5 顺序码规则:
顺序码长3位
顺序码是数字

根据以上规则,写出顺序码的正则表达式 :/d{3}/

1.1.6 校验码规则:
校验码长1位
可以是数字,字母x或字母X

根据以上规则,写出校验码的正则表达式 :/[0-9Xx]/

1.1.2 年コードのルール: 年コードの長さは 4 です。 数字 は、18、19、または 20 の数字で始まります

残りの 2 桁は、0 ~ 9 です

上記の規則に従って、年コードの正規表現を記述します: /(18|19) |20)d{2} /。 18 で始まる年が必要ない場合は、18 を削除できます。

1.1.3 月コードのルール:

月コードは 2 桁です
最初の桁は 0、2 桁目は 1 ~ 9 です
または最初の桁は 1、2 桁目は 0 ~ 2 です

上記の規則に従って、月コードの正規表現を /((0[1-9])|(1[0-2]))/ のように記述します。

1.1.4 日付コードの規則:


日付コードの長さは 2 桁です
最初の桁は 0-2、2 桁目は 1-9 です
または 10、20、30、31

上記によるとrules には、日付コードの正規表現を記述します: /(([0-2][1-9])|10|20|30|31)/

1.1.5 シーケンスコードのルール: 🎜🎜シーケンスコードは3桁です🎜シーケンスコードは数字です🎜🎜上記のルールに従って、シーケンスコードの正規表現を記述します: /d{3 }/ 。 🎜🎜🎜1.1.6 チェックコードのルール: 🎜🎜チェックコードの長さは1桁です🎜数字、文字x、または文字Xを使用できます🎜🎜上記のルールに従って、チェックコードの正規表現を記述します: /[0-9Xx]/コード>。 🎜🎜🎜1.2 プラン 1 の正規表現🎜🎜🎜上記の 6 つのルールに基づいて、完全な正規表現とテスト プログラムは次のようになります: 🎜

1

2

3

4

5

6

7

8

9

10

11

12

13

var p = /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;

//输出 true

console.log(p.test("11010519491231002X"));

//输出 false 不能以0开头

console.log(p.test("01010519491231002X"));

//输出 false 年份不能以17开头

console.log(p.test("11010517491231002X"));

//输出 false 月份不能为13

console.log(p.test("11010519491331002X"));

//输出 false 日期不能为32

console.log(p.test("11010519491232002X"));

//输出 false 不能以a结尾

console.log(p.test("11010519491232002a"));

ログイン後にコピー
🎜🎜1.3 プラン 1 の分析🎜🎜🎜プラン 1 は基本的な形式の決定のみを行います。主な欠点は次の 3 つです: 🎜 住所コードの決定が十分に正確ではありません。例: 私たちの国には 16 または 26 で始まる地域はありませんが、日付を検証することで、日付が十分に正確ではないことが判断できます。例: 19490231 も検証に合格しますが、2 月には 31 日のチェック コードがありません。スキーム 1 は 17 ビット オントロジー コードから計算されます。スキーム 2 (包括的) 🎜 の欠点によると。スキーム 1 の場合、オプション 2 を導入すると、オプション 1 の欠点がさらに改善されます。 🎜🎜🎜2.1 省住所コードの確認🎜🎜🎜中国北部: 北京 11、天津 12、河北 13、山西省 14、内モンゴル自治区 15🎜 中国北東部: 遼寧 21、吉林 22、黒竜江省 23🎜 中国東部: 上海 31、江蘇 32 、浙江省 33、安徽省 34、福建省 35、江西省 36、山東省 37 🎜 中国中部: 河南省 41、湖北省 42、湖南省 43 🎜 中国南部: 広東省 44、広西チワン族自治区 45、海南省 46 🎜 南西部: 四川省 51、貴州省 52、雲南省 53 、チベット54、重慶50🎜北西部: 陝西61、甘粛62、青海63、寧夏64、新疆65🎜特別: 台湾71、香港81、マカオ82🎜

根据上述地址码做身份证号码的前两位校验,进一步的提高准确率。当前的地址码以2013版的行政区划代码【GB/T2260】为标准。由于区划代码的历史演变,使得地址码后四位校验变得不太可能。以三胖的身份证号为例,本人号码是2321开头,而当前行政区划代码表中并无此代码。因此本文只做前两位省级地址码的校验。

也有说法表述91开头是外国人取得中国身份证号码的前两位编码,但本人并未得到证实。如有持91开头身份证或认识马布里的,请帮忙确认相关信息。
根据以上分析,给出省级地址码校验及测试程序如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

var checkProv = function (val) {

 var pattern = /^[1-9][0-9]/;

 var provs = {11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江 ",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北 ",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏 ",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门"};

 if(pattern.test(val)) {

  if(provs[val]) {

   return true;

  }

 }

 return false;

}

//输出 true,37是山东

console.log(checkProv(37));

//输出 false,16不存在

console.log(checkProv(16));

ログイン後にコピー

2.2 出生日期码校验

出生日期码的校验不做解释,直接给出如下函数及测试程序:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

var checkDate function (val) {

 var pattern = /^(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)$/;

 if(pattern.test(val)) {

  var year = val.substring(0, 4);

  var month = val.substring(4, 6);

  var date = val.substring(6, 8);

  var date2 = new Date(year+"-"+month+"-"+date);

  if(date2 && date2.getMonth() == (parseInt(month) - 1)) {

   return true;

  }

 }

 return false;

}

//输出 true

console.log(checkDate("20180212"));

//输出 false 2月没有31日

console.log(checkDate("20180231"));

ログイン後にコピー

2.3 校验码校验

校验码的计算略复杂,先给出如下公式:

其中 ai 表示身份证本体码的第 i 位值,而 Wi 表示第 i 位的加权因子值。

加权因子表 【表1】:

i 1 2 3 4 5 6 7 8
Wi 7 9 10 5 8 4 2 1
9 10 11 12 13 14 15 16 17
6 3 7 9 10 5 8 4 2

X与校验码换算表 【表2】

X 0 1 2 3 4 5 6 7 8 9 10
a18 1 0 X 9 8 7 6 5 4 3 2

算法过程:

  • 根据身份证主体码(前17位)分别与对应的加权因子(表1)计算乘积再求和,根据所得结果与11取模得到X值。

  • 根据 X 值查询表2,得出a18即校验码值。

校验码计算程序及测试见如下代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

var checkCode = function (val) {

 var p = /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;

 var factor = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ];

 var parity = [ 1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2 ];

 var code = val.substring(17);

 if(p.test(val)) {

  var sum = 0;

  for(var i=0;i<p style="text-align: left;"><strong>2.4 方案2整体代码</strong></p><pre class="brush:php;toolbar:false">var checkID = function (val) {

 if(checkCode(val)) {

  var date = val.substring(6,14);

  if(checkDate(date)) {

   if(checkProv(val.substring(0,2))) {

    return true;

   }

  }

 }

 return false;

}

//输出 true

console.log(checkID("11010519491231002X"));

//输出 false,校验码不符

console.log(checkID("110105194912310021"));

//输出 false,日期码不符

console.log(checkID("110105194902310026"));

//输出 false,地区码不符

console.log(checkID("160105194912310029"));

ログイン後にコピー

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读

vue select操作组件开启

使用webpack做出ReactApp

以上がJS+Regex による ID 番号の検証の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHP 正規表現の検証: 数値形式の検出 PHP 正規表現の検証: 数値形式の検出 Mar 21, 2024 am 09:45 AM

PHP 正規表現の検証: 数値形式の検出 PHP プログラムを作成する場合、ユーザーが入力したデータを検証する必要がよくあります。一般的な検証の 1 つは、データが指定された数値形式に準拠しているかどうかを確認することです。 PHP では、正規表現を使用してこの種の検証を行うことができます。この記事では、PHP 正規表現を使用して数値形式を検証する方法を紹介し、具体的なコード例を示します。まず、一般的な数値形式の検証要件を見てみましょう。 整数: 0 ~ 9 の数字のみが含まれ、プラスまたはマイナス記号で始めることができ、小数点は含まれません。浮動小数点

正規表現を使用して Golang でメールアドレスを検証するにはどうすればよいですか? 正規表現を使用して Golang でメールアドレスを検証するにはどうすればよいですか? May 31, 2024 pm 01:04 PM

正規表現を使用して Golang で電子メール アドレスを検証するには、次の手順に従います。 regexp.MustCompile を使用して、有効な電子メール アドレス形式と一致する正規表現パターンを作成します。 MatchString 関数を使用して、文字列がパターンと一致するかどうかを確認します。このパターンは、次のようなほとんどの有効な電子メール アドレス形式をカバーします。 ローカル ユーザー名には文字、数字、および特殊文字を含めることができます: !.#$%&'*+/=?^_{|}~-` ドメイン名には少なくとも次の文字が含まれている必要があります。 1 文字の後に文字、数字、またはハイフンを続けます。トップレベル ドメイン (TLD) は 63 文字を超えることはできません。

Go で正規表現を使用してタイムスタンプを照合するにはどうすればよいですか? Go で正規表現を使用してタイムスタンプを照合するにはどうすればよいですか? Jun 02, 2024 am 09:00 AM

Go では、正規表現を使用してタイムスタンプを照合できます。ISO8601 タイムスタンプの照合に使用されるような正規表現文字列をコンパイルします。 ^\d{4}-\d{2}-\d{2}T \d{ 2}:\d{2}:\d{2}(\.\d+)?(Z|[+-][0-9]{2}:[0-9]{2})$ 。 regexp.MatchString 関数を使用して、文字列が正規表現と一致するかどうかを確認します。

Go言語の正規表現と文字列処理をマスターする Go言語の正規表現と文字列処理をマスターする Nov 30, 2023 am 09:54 AM

最新のプログラミング言語として、Go 言語は強力な正規表現と文字列処理関数を提供し、開発者が文字列データをより効率的に処理できるようにします。開発者にとって、Go 言語での正規表現と文字列処理を習得することは非常に重要です。この記事では、Go 言語の正規表現の基本概念と使い方、Go 言語を使用して文字列を処理する方法を詳しく紹介します。 1. 正規表現 正規表現は文字列のパターンを記述するためのツールであり、文字列の照合、検索、置換などの操作を簡単に実装できます。

PHP 正規表現: 厳密な一致とあいまいな包含の除外 PHP 正規表現: 厳密な一致とあいまいな包含の除外 Feb 28, 2024 pm 01:03 PM

PHP 正規表現: 完全一致と除外 ファジー包含正規表現は、プログラマがテキストを処理する際に効率的な検索、置換、フィルタリングを実行できる強力なテキスト マッチング ツールです。 PHP では、正規表現は文字列処理やデータ マッチングにも広く使用されています。この記事では、PHP で完全一致を実行し、あいまい包含操作を除外する方法に焦点を当て、具体的なコード例を使用して説明します。完全一致 完全一致とは、バリエーションや余分な単語ではなく、正確な条件を満たす文字列のみと一致することを意味します。

Goで正規表現を使用してパスワードを確認するにはどうすればよいですか? Goで正規表現を使用してパスワードを確認するにはどうすればよいですか? Jun 02, 2024 pm 07:31 PM

Go で正規表現を使用してパスワードを検証する方法は次のとおりです。 パスワードの最小要件 (小文字、大文字、数字、特殊文字を含む少なくとも 8 文字) を満たす正規表現パターンを定義します。 regexp パッケージの MustCompile 関数を使用して正規表現パターンをコンパイルします。 MatchString メソッドを使用して、入力文字列が正規表現パターンと一致するかどうかをテストします。

漢字フィルタリング: PHP 正規表現の練習 漢字フィルタリング: PHP 正規表現の練習 Mar 24, 2024 pm 04:48 PM

PHP は広く使用されているプログラミング言語であり、特に Web 開発の分野で人気があります。 Web開発の過程では、ユーザーが入力したテキストをフィルタリングして検証する必要がよくありますが、その中でも文字フィルタリングは非常に重要な操作です。この記事では、PHP で正規表現を使用して漢字フィルタリングを実装する方法と、具体的なコード例を紹介します。まず最初に、Unicode の漢字の範囲は u4e00 から u9fa5 までである、つまりすべての漢字がこの範囲内にあることを明確にする必要があります。

正規表現のワイルドカードとは何ですか? 正規表現のワイルドカードとは何ですか? Nov 17, 2023 pm 01:40 PM

正規表現のワイルドカードには、「.」、「*」、「+」、「?」、「^」、「$」、「[]」、「[^]」、「[a-z]」、「[A-Z]」が含まれます。 、"[0-9]"、"\d"、"\D"、"\w"、"\W"、"\s&quo

See all articles