PHP検査15桁と18桁の身分証番号のパッケージ
新会社のフレームのソースコードは、この機能を発見したので、検索し、識別番号の検査クラスをカプセル化しました。
今は大体18人の身分証番号があります。もちろん、一部の老人の身分証番号は15人です。
18桁を強要すればいいです。15桁の身分証番号にはチェックコードがないので、大体の仕組みを知っていれば、ついでに一連の身分証番号を作ってもいいです。
もちろん、単なる手順検査なら、18人の身分証番号も偽造できます。
一番いいのはやはり関連部門からのインターフェースを呼び出して、検証します。
本明細書で作成された身分証明書番号検査は、関連規則の下での計算だけで、インターフェースを呼び出す前に行うことができるものです。
身分証番号規則
15位:省(2位)+地級市(2位)+県級市(2位)+生年(2位)+生月(2位)+生日(2位)+順番号(3位)
18位:省(2位)+地級市(2位)+県級市(2位)+生年(4位)+生月(2位)+生日(2位)+順番番(3位)+検査位(1位)
対照的に、18人は15人よりも出生年の2人、検査位の1人多いです。
なお、順番番号が偶数であれば、女の子、順番番号が奇数であることを示し、男性であることを示している。
検証ビットの計算:
17桁の数字があります。それぞれ:
7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2
身分証の上位17桁にそれぞれ上記の位置の数字を掛けて加算します。
次に加算の和で11を型取りします。
得られた値で下の11文字の中から該当する位置の文字を検索します。この文字はチェックビットです。
'1','0','X','9','8','7','6','5','4','3','2'
15位から18位へ:
上記の分析から、前年分と検査位を補充すればいいということが分かります。
一般的には、年度補足は全部19を加えたらいいです。
クラスの実装を検証
身分証番号の規則を分析することによって、いくつかのことができると分かりました。は、アイデンティティが正しいかどうかを検査する(一般的には変化しないし、省も多くない) 。.地級市と県級市を検査する(この方面の資源があれば考慮できるが、一般的には推奨しない) 検査年月日 チェックサム もちろん、一部の人が15桁の身分証番号を使っているので、変換の方法が必要ですが、ここでは18桁の身分証番号を制限することを提案します。
以下から実行します。
初期化:
身分証番号かどうかを検出します。
このブロックの処理は比較的簡単で,一つの正規表現ができた。
その中で、(^\d{15}が15桁の身分証番号と一致する場合に使用されます。(^\d{17}(\d 124 X)$は、18ビットの識別番号と一致する場合に使用されます。
ロジックは複雑ではないので、まず15桁かどうかを判断して、追加が必要な年を判断して、最終的にチェックマークを作成してスペルを返してもいいです。
詳しい計算規則は上を見てください。ここでは繰り返しの説明はしません。
ここも正則で年月日を合わせます。
ところで、15位から18位まではこの方法は全く考えられなくなりました。
転送ゲート:IDCard Filter
最後に
この機能はせいぜい斬新ですよね。なにしろこれまで接触したことがないですから。コードの断片に新しいメンバーが追加されて嬉しいです。
以上は小编がご绍介したPHP検査15名と18名の身分証番号のパッケージです。皆様にご迷惑をおかけしたいのですが、もし何かご不明な点があれば、メッセージをください。小编はすぐにご返事します。ここでも私たちのサイトを応援してくれてありがとうございます。
今は大体18人の身分証番号があります。もちろん、一部の老人の身分証番号は15人です。
18桁を強要すればいいです。15桁の身分証番号にはチェックコードがないので、大体の仕組みを知っていれば、ついでに一連の身分証番号を作ってもいいです。
もちろん、単なる手順検査なら、18人の身分証番号も偽造できます。
一番いいのはやはり関連部門からのインターフェースを呼び出して、検証します。
本明細書で作成された身分証明書番号検査は、関連規則の下での計算だけで、インターフェースを呼び出す前に行うことができるものです。
身分証番号規則
15位:省(2位)+地級市(2位)+県級市(2位)+生年(2位)+生月(2位)+生日(2位)+順番号(3位)
18位:省(2位)+地級市(2位)+県級市(2位)+生年(4位)+生月(2位)+生日(2位)+順番番(3位)+検査位(1位)
対照的に、18人は15人よりも出生年の2人、検査位の1人多いです。
なお、順番番号が偶数であれば、女の子、順番番号が奇数であることを示し、男性であることを示している。
検証ビットの計算:
17桁の数字があります。それぞれ:
7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2
身分証の上位17桁にそれぞれ上記の位置の数字を掛けて加算します。
次に加算の和で11を型取りします。
得られた値で下の11文字の中から該当する位置の文字を検索します。この文字はチェックビットです。
'1','0','X','9','8','7','6','5','4','3','2'
15位から18位へ:
上記の分析から、前年分と検査位を補充すればいいということが分かります。
一般的には、年度補足は全部19を加えたらいいです。
クラスの実装を検証
身分証番号の規則を分析することによって、いくつかのことができると分かりました。
以下から実行します。
初期化:
class IDCardFilter
{
/**
*
*
* @param string $idCard
* @return bool
*/
public function vaild($idCard)
{
// ,
if (!$this->isCardNumber($idCard)) {
return false;
}
// 15 18
$idCard = $this->fifteen2Eighteen($idCard);
//
if (!$this->checkProvince($idCard)) {
return false;
}
//
if (!$this->checkBirthday($idCard)) {
return false;
}
//
return $this->checkCode($idCard);
}
}
上にはもう一つの検査方法が実現されました。中にはクラスの多くの方法が呼び出されました。身分証番号かどうかを検出します。
このブロックの処理は比較的簡単で,一つの正規表現ができた。
その中で、(^\d{15}が15桁の身分証番号と一致する場合に使用されます。(^\d{17}(\d 124 X)$は、18ビットの識別番号と一致する場合に使用されます。
const REGX = '#(^\d{15}$)|(^\d{17}(\d|X)$)#';
/**
*
*
* @param string $idCard
* @return boolean
*/
public function isCardNumber($idCard)
{
return preg_match(self::REGX, $idCard);
}
15位から18位へ:ロジックは複雑ではないので、まず15桁かどうかを判断して、追加が必要な年を判断して、最終的にチェックマークを作成してスペルを返してもいいです。
/**
* 15 18
*
* @param string $idCard
* @return void
*/
public function fifteen2Eighteen($idCard)
{
if (strlen($idCard) != 15) {
return $idCard;
}
// 996 997 998 999,
// $code = array_search(substr($idCard, 12, 3), [996, 997, 998, 999]) !== false ? '18' : '19';
// 19
$code = '19';
$idCardBase = substr($idCard, 0, 6) . $code . substr($idCard, 6, 9);
return $idCardBase . $this->genCode($idCardBase);
}
検証コードの生成:詳しい計算規則は上を見てください。ここでは繰り返しの説明はしません。
/**
*
*
* @param string $idCardBase
* @return void
*/
final protected function genCode($idCardBase)
{
$idCardLength = strlen($idCardBase);
if ($idCardLength != 17) {
return false;
}
$factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
$verifyNumbers = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
$sum = 0;
for ($i = 0; $i < $idCardLength; $i++) {
$sum += substr($idCardBase, $i, 1) * $factor[$i];
}
$index = $sum % 11;
return $verifyNumbers[$index];
}
省が正しいかどうかを確認します。
protected $provinces = [
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 => " ", 91 => " "
];
/**
*
*
* @param string $idCard
* @return void
*/
public function checkProvince($idCard)
{
$provinceNumber = substr($idCard, 0, 2);
return isset($this->provinces[$provinceNumber]);
}
誕生日が正しいかどうかを検出します。ここも正則で年月日を合わせます。
/**
*
*
* @param string $idCard
* @return void
*/
public function checkBirthday($idCard)
{
$regx = '#^\d{6}(\d{4})(\d{2})(\d{2})\d{3}[0-9X]$#';
if (!preg_match($regx, $idCard, $matches)) {
return false;
}
array_shift($matches);
list($year, $month, $day) = $matches;
return checkdate($month, $day, $year);
}
検証コード比:ところで、15位から18位まではこの方法は全く考えられなくなりました。
/**
*
*
* @param string $idCard
* @return void
*/
public function checkCode($idCard)
{
$idCardBase = substr($idCard, 0, 17);
$code = $this->genCode($idCardBase);
return $idCard == ($idCardBase . $code);
}
完全コード転送ゲート:IDCard Filter
最後に
この機能はせいぜい斬新ですよね。なにしろこれまで接触したことがないですから。コードの断片に新しいメンバーが追加されて嬉しいです。
以上は小编がご绍介したPHP検査15名と18名の身分証番号のパッケージです。皆様にご迷惑をおかけしたいのですが、もし何かご不明な点があれば、メッセージをください。小编はすぐにご返事します。ここでも私たちのサイトを応援してくれてありがとうございます。