فيما يلي رمز التحقق من الصلاحية باستخدام JS وفقًا لقواعد ترميز رقم المعرف.
رمز IDCARD-VANIDED.JS كما يلي:
نسخة الكود كما يلي:
/**
* قواعد تشفير 15 بت لبطاقة الهوية: DDDDDD YYMMDD XX P
* DDDDDD: الرمز الإقليمي
* Yymmdd: تاريخ الميلاد
* xx: ترميز الفئة المتسلسلة ، لا يمكن تحديده
* P: الجنس ، الأرقام الفردية من الذكور ، حتى الأرقام من الإناث
* <p />
* قواعد تشفير 18 بت لبطاقة الهوية: DDDDDDDDDDDDDDDDDD XXX Y
* DDDDDD: الرمز الإقليمي
* Yyyymmdd: تاريخ الميلاد
* xxx: ترميز نوع التسلسل ، لا يمكن تحديده ، الأرقام الفردية من الذكور ، حتى الأرقام هي الإناث
* Y: تحقق من الرمز ، يمكن الحصول على قيمة هذا الرقم من خلال أول 17 رقمًا
* <p />
* عامل الترجيح لعدد الرقم 18 رقمًا هو (يمينًا إلى اليسار) wi = [7 ، 9 ، 10 ، 5 ، 8 ، 4 ، 2 ، 1 ، 6 ، 7 ، 9 ، 10 ، 5 ، 8 ، 4 ، 2 ، 1]
* بت التحقق من y = [1 ، 0 ، 10 ، 9 ، 8 ، 7 ، 6 ، 5 ، 4 ، 3 ، 2]
* تركيبة الحساب لفحص بت: y_p = mod (∑ (ai × wi) ، 11)
* أنا 2 ... 18 رقمًا من رقم الهوية من اليمين إلى اليسار ؛
*
*/
var wi = [7 ، 9 ، 10 ، 5 ، 8 ، 4 ، 2 ، 1 ، 6 ، 3 ، 7 ، 9 ، 10 ، 5 ، 8 ، 4 ، 2 ، 1] ؛ // عامل الترجيح
var appaleCode = [1 ، 0 ، 10 ، 9 ، 8 ، 7 ، 6 ، 5 ، 4 ، 3 ، 2] ؛
وظيفة idcardvalidate (idcard) {
idcard = trim (idcard.replace ( / / g ، "")) ؛
if (idcard.length == 15) {
إرجاع isValidityBrithBrithBy15Idcard (IdCard) ؛
} آخر إذا (idcard.length == 18) {
var a_idcard = idcard.split ("") ؛ // احصل على صفيف بطاقة الهوية
if (isValidityBrithBrithby18Idcard (idcard) && ittruevalidateCodeby18Idcard (a_idcard)) {
العودة صحيح.
}آخر {
العودة كاذبة
}
} آخر {
العودة كاذبة
}
}
/**
* حدد ما إذا كان بت التحقق الأخير صحيحة عندما يكون رقم المعرف 18 رقمًا
* param a_idcard رقم معرف صفيف
* @يعود
*/
دالة isTrueValidateCodeBy18Idcard (a_idcard) {
var sum = 0 ؛
if (a_idcard [17] .ToLowerCase () == 'x') {
A_IDCARD [17] = 10 ؛ // استبدل رمز التحقق مع البت الأخير X مع 10 للعمليات اللاحقة
}
لـ (var i = 0 ؛ i <17 ؛ i ++) {
sum += wi [i] * a_idcard [i] ؛ // sum الموزونة
}
valcodeposition = sum ٪ 11 ؛ // أين يمكن الحصول على رمز التحقق
if (a_idcard [17] == ValidEcode [ValCodeposition]) {
العودة صحيح.
} آخر {
العودة كاذبة
}
}
/**
*احكم على ما إذا كان رجلًا أو امرأة من خلال بطاقة الهوية
* param idcard 15/18 رقم هوية
* return 'female'-female ، 'ذكرى الذكور
*/
وظيفة maleorfemalbyidcard (idcard) {
idcard = trim (idcard.replace (// g ، "")) ؛ // معالجة رقم المعرف. بما في ذلك المسافات بين الشخصيات.
if (idcard.length == 15) {
if (idcard.substring (14،15) ٪ 2 == 0) {
عودة "أنثى" ؛
}آخر{
العودة "ذكر" ؛
}
} آخر إذا (idcard.length == 18) {
if (idcard.substring (14،17) ٪ 2 == 0) {
عودة "أنثى" ؛
}آخر{
العودة "ذكر" ؛
}
}آخر{
العودة لاغية.
}
// يمكن معالجة الأحرف الواردة مباشرة كصفيف
// if (idcard.length == 15) {
// ALERT (idcard [13]) ؛
// if (idcard [13] ٪ 2 == 0) {
// إرجاع 'الأنثى' ؛
// }آخر{
// العودة "ذكر" ؛
//}
//} آخر إذا (idcard.length == 18) {
// ALERT (IDCARD [16]) ؛
// if (idcard [16] ٪ 2 == 0) {
// إرجاع 'الأنثى' ؛
// }آخر{
// العودة "ذكر" ؛
//}
// }آخر{
// إرجاع فارغ ؛
//}
}
/**
* تحقق مما إذا كان عيد ميلاد في رقم الهوية المكون من 18 رقماً هو عيد ميلاد صالح
* @param idcard سلسلة معرف الكتاب 18 بت
* @يعود
*/
وظيفة isValidityBrithbrithby18Idcard (idcard18) {
var year = idcard18.SubString (6،10) ؛
var month = idcard18.SubString (10،12) ؛
var day = idcard18.SubString (12،14) ؛
var temp_date = تاريخ جديد (السنة ، parsefloat (شهر) -1 ، parsefloat (day)) ؛
// استخدم GetLyear () هنا للحصول على العام لتجنب مشكلة أخطاء الألفية
if (temp_date.getlyear ()! = parsefloat (السنة)
|| temp_date.getmonth ()! = parsefloat (شهر) -1
|| temp_date.getDate ()! = parsefloat (اليوم)) {
العودة كاذبة
}آخر{
العودة صحيح.
}
}
/**
* تحقق مما إذا كان عيد ميلاد في رقم الهوية المكون من 15 رقمًا هو عيد ميلاد صالح
* param idcard15 سلسلة معرف كتاب 15 بت
* @يعود
*/
وظيفة isValidityBrithBrithby15Idcard (idcard15) {
var year = idcard15.substring (6،8) ؛
var month = idcard15.substring (8،10) ؛
var day = idcard15.substring (10،12) ؛
var temp_date = تاريخ جديد (السنة ، parsefloat (شهر) -1 ، parsefloat (day)) ؛
// لعمرك في بطاقة الهوية القديمة الخاصة بك ، لا تحتاج إلى النظر في مشكلة الدودة الألفية واستخدام طريقة getyear ()
if (temp_date.getyear ()! = parsefloat (السنة)
|| temp_date.getmonth ()! = parsefloat (شهر) -1
|| temp_date.getDate ()! = parsefloat (اليوم)) {
العودة كاذبة
}آخر{
العودة صحيح.
}
}
// قم بإزالة مساحات رأس السلسلة والذيل
وظيفة trim (str) {
إرجاع str.replace (/(^/s*) | (/s*$)/g ، "") ؛
}
الإصدار 2 المحدث
نسخة الكود كما يلي:
وظيفة CheckIdCard (NUM)
{
num = num.toupperCase () ؛
//رقم بطاقة الهوية هو 15 أو 18 رقمًا.
if (! (/(^/d {15} $) | (^/d {17} ([0-9] | x) $)/. test (num)))))))
{
// ALERT ('يجب أن يكون طول رقم المعرف الذي تم إدخاله غير صحيح ، أو أن الرقم لا يفي بالمتطلبات!
العودة كاذبة
}
// يتم إنشاء جزء الشيك وفقًا لأحكام ISO 7064: 1983.MOD 11-2 ، ويمكن اعتبار x الرقم 10.
// يحلل ما يلي تاريخ الميلاد وتحقق من الأرقام على التوالي
فار لين ، رد ؛
len = num.length ؛
إذا (لين == 15)
{
re = جديد regexp (/^(/d {6}) (/d {2}) (/d {2}) (/d {2}) (/d {2}) (/d {3}) $ /) ؛
var arrsplit = num.match (re) ؛
// تحقق مما إذا كان تاريخ عيد الميلاد صحيحًا
var dtmbirth = تاريخ جديد ('19 ' + arrsplit [2] +'/' + arrsplit [3] +'/' + arrsplit [4]) ؛
var bgoodday ؛
bgoodday = (dtmbirth.getyear () == number (arrsplit [2])) && ((dtmbirth.getMonth () + 1) == رقم (Arrsplit [3])) && (dtmbirth.getDate () == n umber (Arrsplit [4])) ؛
إذا (! bgoodday)
{
// تنبيه ("تاريخ الميلاد في رقم المعرف الذي تم إدخاله غير صحيح!") ؛
العودة كاذبة
}
آخر
{
// قم بتحويل بطاقة هوية مكونة من 15 رقمًا إلى 18 رقمًا
// يتم إنشاء جزء الشيك وفقًا لأحكام ISO 7064: 1983.MOD 11-2 ، ويمكن اعتبار x الرقم 10.
var arrint = صفيف جديد (7 ، 9 ، 10 ، 5 ، 8 ، 4 ، 2 ، 1 ، 6 ، 3 ، 7 ، 9 ، 10 ، 5 ، 8 ، 4 ، 2) ؛
var arrch = new array ('1' ، '0' ، 'x' ، '9' ، '8' ، '7' ، '6' ، '5' ، '4' ، '3' ، '2') ؛
var ntemp = 0 ، i ؛
num = num.substr (0 ، 6) + '19' + num.substr (6 ، num.length - 6) ؛
لـ (i = 0 ؛ i <17 ؛ i ++)
{
ntemp += num.substr (i ، 1) * arrint [i] ؛
}
num += arrch [ntemp ٪ 11] ؛
العودة صحيح.
}
}
إذا (لين == 18)
{
re = جديد regexp (/^(/d {6}) (/d {4}) (/d {2}) (/d {2}) (/d {3}) ([0-9] | x ) $/) ؛
var arrsplit = num.match (re) ؛
// تحقق مما إذا كان تاريخ عيد الميلاد صحيحًا
var dtmbirth = تاريخ جديد (arrsplit [2] + "/" + arrsplit [3] + "/" + arrsplit [4]) ؛
var bgoodday ؛
bgoodday = (dtmbirth.getlyear () == number (arrsplit [2])) && ((dtmbirth.getMonth () + 1) == الرقم (Arrsplit [3]))) Arrsplit [4]) ؛
إذا (! bgoodday)
{
// ALERT (dtmbirth.getyear ()) ؛
// ALERT (ARRSPLIT [2]) ؛
// تنبيه ("تاريخ الميلاد في رقم المعرف الذي تم إدخاله غير صحيح!") ؛
العودة كاذبة
}
آخر
{
// تحقق مما إذا كان رمز التحقق لبطاقة الهوية المكونة من 18 رقمًا صحيحًا.
// يتم إنشاء جزء الشيك وفقًا لأحكام ISO 7064: 1983.MOD 11-2 ، ويمكن اعتبار x الرقم 10.
var valnum ؛
var arrint = صفيف جديد (7 ، 9 ، 10 ، 5 ، 8 ، 4 ، 2 ، 1 ، 6 ، 3 ، 7 ، 9 ، 10 ، 5 ، 8 ، 4 ، 2) ؛
var arrch = new array ('1' ، '0' ، 'x' ، '9' ، '8' ، '7' ، '6' ، '5' ، '4' ، '3' ، '2') ؛
var ntemp = 0 ، i ؛
لـ (i = 0 ؛ i <17 ؛ i ++)
{
ntemp += num.substr (i ، 1) * arrint [i] ؛
}
valnum = arrch [ntemp ٪ 11] ؛
if (valnum! = num.substr (17 ، 1))
{
// ALERT ('رمز التحقق لبطاقة هوية 18 بت غير صحيح! يجب أن يكون:' + valnum) ؛
العودة كاذبة
}
العودة صحيح.
}
}
العودة كاذبة
}