15자리에서 18자리 ID 번호로 변환을 실현하고 중국 본토 주민 ID 카드, 홍콩 주민 ID 카드, 마카오 ID 카드 및 대만 ID 카드를 확인하세요.
- /**
- * 신분증 도구 강좌
- *
- * @author Tongle Xu 2013-6-6
- * @copyright Copyright (c) 2003-2103tintsoft.com
- * @license http://www.tintsoft.com
- * @version $Id$
- */
- class Utils_Idcard {
- /**
- * 중국 주민등록번호의 최소 길이입니다.
- */
- const CHINA_ID_MIN_LENGTH = 15;
-
- /**
- * 중국 주민등록번호의 최대 길이입니다.
- */
- const CHINA_ID_MAX_LENGTH = 18;
-
- /**
- * 最低年限
- */
- const MIN = 1930;
-
- /
- 🎜> public static $cityCode = array ("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」);
-
- /**
- * 省、直轄市代碼表
- */
- public static $power = array (7,9,10,5,8,4,2,1,6,3,7,9,10, 5,8,4,2 );
-
- /**
- * 每位加權因子
- */
- public static $verifyCode = array ("1","0","X","9"," 8","7","6","5","4","3","2" );
- /**
- * 第18位校檢碼
- */
- public static $cityCodes = array (' 11' => '北京' );
-
- /**
- * 國內身分證校驗
- */
- public static function conver15CardTo18($idCard) {
- $idCard18 = "";
- if ( strlenstrlen ( $idCard ) != self::CHINA_ID_MIN_LENGTH) {
- return null;
- }
- if (self::isNum ( $idCard )) {
- // 取得出生年月日
-
- $sYear = '19' 。轉換字元備份
- $iArr = str_split ( $idCard18 );
- if ($iArr != null) {
- $iSum17 = self::getPowerSum ( $iArr );
- // 取得校驗取得位元
- $sVal = self::getCheckCode18 ( $iSum17 );
- if (strlen ( $sVal ) > 0) {
- $idCard18 . = $sVal;
- } else {
- 回傳 null;
- }
- }
- } else {
- 回傳 null;
- }
- 回傳 $idCard18; }
-
- /**
- * 將15位元身分證號碼轉換為18位元
- *
- * @param idCard 15位元身分編碼
- * @return 18位元身分編碼
- */
- public static function validateCard($idCard) {
- $card = trim ( $idCard );
- if (self::valid $ald )) {
- 回傳true; }
- if (self::validateIdCard15 ( $card )) {
- 回傳true;
- }
- 回傳false;
- }
-
- /**
- * 驗證身分證是否合法
- */
- public static function validateIdCard18($idCard) {
- $bTrue = false;
- if (strlen ( $idCard. {
- // 前17 位元
- $code17 = substr ( $idCard, 0, 17 );
- // 第18 位元
- $code18 = substr ( $idCard, 17, 1 );
- if (self::isNum ( $code17 )) {
- $iArr = str_split ( $code17 );
- if ($iArr != null) {
- $iSum17 = self::getPowerSum ( $self iArr );
- // 取得校驗位
- $val = self::getCheckCode18 ( $iSum17 );
- if (strlen ( $val ) > 0 && $val == $code18) {
- $bTrue = true;
- }
- }
- }
- }
- return $bTrue;
- }
-
- /**
- * 驗證18位元身分編碼是否合法
- *
- * @param int $idCard 身分編碼
- * @return boolean 是否合法
- */
- public static function validateIdCard15($idCard) {
- if (strlen ( $idCard ) != self::CHINA_ID_MIN_LENGTH) {
- return false;
- }
- 🎜> return false;
- } $proCode = substr ( $idCard, 0, 2 );
- if (! isset ( self::$cityCodes [$proCode] )) {
- return false;
- }
- //升到18位元
- $idCard = self::conver15CardTo18($idCard); return self::validateIdCard18($idCard);
- } else {
- 回傳false;
- }
- 回傳true;
- }
-
- /** 公用靜態函數getAgeByIdCard($idCard) {
- $iAge = 0;
- if (strlen ( $idCard ) == self::CHINA_ID_MIN_LENGTH) {
- $idCard = ::CHINA_ID_MIN_LENGTH) {
- $idCard = 15 $idCard );
- }
- $year = substr ( $idCard, 6, 4 );
- $iCurrYear = 日期( 'Y', time () );
- $iAge = $iCurrYear - $year;
- return $iAge;
- }
-
- /**
- * 驗證15位元身分編碼是否合法
- *
- * @param string $idCard 身分編碼
- * @return boolean 是否合法
- */
- public static function getDateByIdCard($idCard) {
- $len = strlen ($idCard) );
- if ($len
- self::CHINA_ID_MIN_LENGTH) {
- return null;
- } else if ($len == CHINA_ID_MIN_LENGTH) { $idCard = == CHINA_ID_MIN_LENGTH) { }
- return substr ( $idCard, 12, 2 );
- }
-
- /**
- * ID 번호를 기준으로 성별 가져오기
- *
- * @param string $idCard ID 번호
- * @return 성별(M-남성, F-여성, N-알 수 없음)
- */
- 공개 정적 함수 getGenderByIdCard($idCard) {
- $sGender = "N";
- if (strlen ( $idCard ) == self: :CHINA_ID_MIN_LENGTH) {
- $idCard = self::conver15CardTo18 ( $idCard );
- }
- $sCardNum = substr ( $idCard, 16, 1 );
- if (( int ) $sCardNum % 2 != 0) {
- $sGender = "M";
- } else {
- $sGender = "F";
- }
- return $sGender;
- }
-
- /**
- * 주민등록번호를 기준으로 호적도 구하기
- *
- * @param string $idCard 주민등록번호
- * @return string
- */
- 공개 정적 함수 getProvinceByIdCard($idCard) {
- $len = strlen( $idCard );
- $sProvince = null;
- $sProvinNum = " ";
- if ($len == self::CHINA_ID_MIN_LENGTH || $len == self::CHINA_ID_MAX_LENGTH) {
- $sProvinNum = substr ( $idCard, 0, 2 );
- }
- $sProvince = self::$cityCodes [$sProvinNum];
- return $sProvince;
- }
-
- /**
- * 숫자 검증
- *
- * @param int $val
- */
- 공개 정적 함수 isNum($val) {
- $val == null || $val == "" ? 거짓: 0 < preg_match ( '/^[0-9]*$/', $val );
- }
- /**
- * 날짜가 현재 날짜보다 작을 경우 유효한지 확인
- *
- * @param int $iYear 확인할 날짜(연도)
- * @param int $iMonth 확인할 날짜 확인(1~12월)
- * @param int $iDate 확인 날짜(일)
- * @return 유효한지 여부
- */
- 공개 정적 함수 valiDate($iYear, $iMonth , $iDate) {
- $연도 = 날짜 ( 'Y', 시간 () );
- if ($iYear < self::MIN || $iYear >= $year) {
- return false;
- }
- if ($iMonth < 1 || $iMonth > 12) {
- return false;
- }
- 스위치($iMonth) {
- 사례 4:
- 사례 6 :
- 사례 9 :
- 사례 11 :
- $datePerMonth = 30;
- break;
- 사례 2 :
- $dm = (($iYear % 4 = = 0 && $iYear % 100 != 0) || ($iYear % 400 == 0)) && ($iYear > self::MIN && $iYear < $year);
- $datePerMonth = $dm ? 29 : 28;
- 휴식;
- 기본값 :
- $datePerMonth = 31;
- }
- return ($iDate >= 1) && ($iDate <= $datePerMonth);
- }
-
- /**
- * ID 카드의 각 비트에 해당 비트의 가중치를 곱한 후 합산 값을 구합니다.
- *
- * @param array $iArr
- * @return ID 코드.
- */
- 개인 정적 함수 getPowerSum($iArr) {
- $iSum = 0;
- $power_len = count ( self::$power );
- $iarr_len = 개수 ( $iArr );
- if ($power_len == $iar_len) {
- for($i = 0; $i < $iarr_len; $i ) {
- for($j = 0; $j if ($i == $j) {
- $iSum = $iSum $iArr [$i] * self:: $power [$j];
- }
- }
- }
- }
- return $iSum;
- }
-
- /**
- * 검사 코드 판단을 위해 11의 거듭제곱 합계 값을 취하여 나머지를 구합니다
- *
- * @param int $iSum
- * @return 검사 숫자
- */
- 개인 정적 함수 getCheckCode18($iSum) {
- $sCode = "";
- 스위치($iSum % 11) {
- 사례 10 :
- $sCode = "2";
- break ;
- 사례 9 :
- $sCode = "3";
- 중단;
- 사례 8 :
- $sCode = "4";
- 중단;
- 사례 7:
- $sCode = "5";
- 중단;
- 사례 6 :
- $sCode = "6";
- 중단;
- 사례 5:
- $sCode = "7" ;
- 중단;
- 사례 4 :
- $sCode = "8";
- 중단;
- 사례 3 :
- $sCode = "9";
- 중단;
- 사례 2 :
- $sCode = "x";
- 중단;
- 사례 1 :
- $sCode = "0";
- 중단;
- 사례 0 :
- $ sCode = "1";
- break;
- }
- return $sCode;
- }
- }
复system代码
- /**
- * 신분증 도구 강좌
- *
- * @author Tongle Xu 2013-6-6
- * @copyright Copyright (c) 2003-2103tintsoft.com
- * @license http://www.tintsoft.com
- * @version $Id$
- */
- class Utils_Idcard {
- /**
- * 중국 주민등록번호의 최소 길이입니다.
- */
- const CHINA_ID_MIN_LENGTH = 15;
-
- /**
- * 중국 주민등록번호의 최대 길이입니다.
- */
- const CHINA_ID_MAX_LENGTH = 18;
-
- /**
- * 최소 연도
- */
- const MIN = 1930;
-
- /**
- *지방 및 자치단체 코드표
- */
- public static $cityCode = 배열 ("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" );
-
- /**
- * 비트별 가중치 인자
- */
- public static $power = 배열 (7,9,10,5,8,4,2,1,6,3,7,9,10, 5,8,4,2 );
-
- /**
- * 18자리 체크코드
- */
- public static $verifyCode = 배열 ("1","0","X","9"," 8","7","6","5","4","3","2" );
- /**
- * 국내 신분증 확인
- */
- public static $cityCodes = array (' 11' => '베이징','12' => '천진','14' => '산시','15' => '내몽골', ' 21' => '랴오닝','22' => '지린','31' => '상하이','32' => ' 33' => '절강','34' => '안후이','36' => '장시','37' => ' 41' => '허난','42' => '후베이','44' => '광둥','45' =>
- '46' => '하이난','51' => '사천','52' => 운남','54' => '티베트','61' => '산시','62' => '내몽고','21' => '랴오닝','22' => '지린','23' => '헤이룽장','31' => '장쑤성','33' => '절강','34' => '안휘','36' => '장시','37' => '허난성','42' => '후베이성','43' => '후난성',
- '44' => '광둥성','45' => '광시성','46' => '하이난','50' => '사천','52' => '운남','54' => '티베트','61' => '산시','63' => '칭하이','65' => '신장','71' => '홍콩','82' => '해외','63 ' => '칭하이','64' => '닝샤','65' => '대만','81' => '홍콩' 🎜> '82' => '마카오','91' => '외국' );
-
- /**
- * 대만 신분증 인증
- *
- * @var array
- */
- public static $twFirstCode = array ('A ' => 10,'B' => 12,'D' => 14,'F' => > 16,'H' => 17,'K' => 19,'M' => 21; 22,'P' => 23,'R' => 26,'T' => 28, 'V' => 29,'X' => 31,'W' => 33,'I' => ' => 35 );
-
- /**
- * 홍콩 신분증 확인
- */
- public static $hkFirstCode = array ('A' => 1,'B' => 2,'C' => 3, 'R' => 18,'Z' => 26,'W' => ; 15,'N ' => 14 );
-
- /**
- * 15자리 ID번호를 18자리로 변환
- *
- * @param idCard 15자리 식별코드
- * @return 18자리 식별코드
- */
- 공개 정적 함수 conver15CardTo18($idCard) {
- $idCard18 = "";
- if (strlen ( $ idCard ) != self::CHINA_ID_MIN_LENGTH) {
- return null;
- }
- if (self::isNum ( $idCard )) {
- // 태어난 연도, 월 가져오기 그리고 day
- $sYear = '19' . substr ( $idCard, 6, 2 );
- $idCard18 = substr ( $idCard, 0, 6 ) . substr ( $idCard, 8 );
- // 문자 배열 변환
- $iArr = str_split ( $idCard18 );
- if ($iArr != null) {
- $iSum17 = self::getPowerSum ( $iArr );
- / / 검사 숫자 가져오기
- $sVal = self::getCheckCode18 ( $iSum17 );
- if (strlen ( $sVal ) > 0) {
- $idCard18 .= $sVal;
- } else {
- return null;
- }
- }
- } else {
- return null;
- }
- return $idCard18;
- }
-
- /**
- * 신분증이 유효한지 확인하세요
- */
- 공개 정적 함수 verifyCard($idCard) {
- $card = Trim ( $idCard );
- if (self::validateIdCard18 ( $card )) {
- return true;
- }
- if (self::validateIdCard15 ( $card )) {
- return true;
- }
- $cardval = self::validateIdCard10 ( $card );
- if ($ Cardval != null) {
- if ($cardval [2] == "true") {
- return true;
- }
- }
- return false;
- }
-
- /**
- * 18자리 식별 코드가 유효한지 확인
- *
- * @param int $idCard 식별 코드
- * @return boolean 합법 여부
- */
- 공개 정적 함수 verifyIdCard18($idCard) {
- $bTrue = false;
- if (strlen ( $idCard ) == self::CHINA_ID_MAX_LENGTH ) {
- // 전17位
- $code17 = substr ( $idCard, 0, 17 );
- // 第18位
- $code18 = substr ( $idCard, 17, 1 );
- if (self::isNum ( $code17 )) {
- $iArr = str_split ( $code17 );
- if ($iArr != null) {
- $iSum17 = self::getPowerSum ( $iArr );
- // 获取校验位
- $val = self::getCheckCode18 ( $iSum17 );
- if (strlen ( $val ) > 0 && $val == $code18) {
- $bTrue = true;
- }
- }
- }
- }
- return $bTrue;
- }
-
- /**
- * 15자리 식별 코드가 적법한지 확인
- *
- * @param string $idCard 식별 코드
- * @return boolean 적법 여부
- */
- 공개 정적 함수 verifyIdCard15($idCard) {
- if (strlen ( $idCard ) != self::CHINA_ID_MIN_LENGTH) {
- return false;
- }
- if (self::isNum ( $ idCard )) {
- $proCode = substr ( $idCard, 0, 2 );
- if (! isset ( self::$cityCodes [$proCode] )) {
- return false;
- }
- // 升到18位
- $idCard = self::conver15CardTo18 ( $idCard );
- return self::validateIdCard18 ( $idCard );
- } else {
- return false;
- }
- return true;
- }
-
- /**
- * 10자리 식별 코드가 유효한지 확인
- *
- * @param idCard 식별 코드
- * @return ID 카드 정보 배열
- * [0] - 대만, 마카오, 홍콩 [1] - 성별(남성 M, 여성 F, 알 수 없음 N) [2] - 적법한가(법적 참, 불법 거짓)
- * 주민등록번호가 아닐 경우 null을 반환
- *
- */
- public static function verifyIdCard10($idCard) {
- $info = array ();
- $card = str_replace ( "[\(|\)]", "", $card );
- $len = strlen ( $card );
- if ($len != 8 && $len ! = 9 && $len != 10) {
- return null;
- }
- if (0 < preg_match ( "/^[a-zA-Z][0-9]{9}$/", $idCard )) { // 台湾
- $info [0] = "台湾";
- $char2 = substr ( $idCard, 1, 1 );
- if ($char2 == "1") {
- $info [1] = "M";
- } else if ($char2 == " 2") {
- $info [1] = "F";
- } else {
- $info [1] = "N";
- $info [2] = "false";
- return $info;
- }
- $info [2] = self::validateTWCard ( $idCard ) ? "true" : "false";
- } else if (0 < preg_match ( "/^[1|5|7][0-9]{6}\(?[0-9A-Z]\) ?$/", $idCard )) { // 澳门
- $info [0] = "澳门";
- $info [1] = "N";
- // TODO
- } else if (0 < preg_match ( "/^[A-Z]{1,2}[0-9]{6}\(?[0-9A]\)?$/", $idCard )) { // 향港
- $info [0] = "향港";
- $info [1] = "N";
- $info [2] = self::validateHKCard ( $idCard ) ? "true" : "false";
- } else {
- null 반환;
- }
- 정보 반환;
- }
-
- /**
- * 대만 신분증 번호 확인
- *
- * @param string idCard 신분증 번호
- * @return 확인 코드가 일치합니다
- */
- 공개 정적 함수 verifyTWCard($idCard) {
- $start = substr( $idCard, 0, 1 );
- $mid = substr( $idCard, 1, 8 );
- $end = substr( $idCard, 9, 1 );
- $iStart = self::$twFirstCode ['start'];
- $sum = $iStart / 10 ($iStart % 10) * 9;
- $chars = str_split ( $mid );
- $iflag = 8;
- foreach ( $chars as $c ) {
- $sum = $sum $c "" * $iflag;
- $iflag --;
- }
- return ($sum % 10 == 0 ? 0 : (10 - $sum % 10)) == $end ? true : false;
- }
-
- /**
- * 홍콩 신분증 번호 확인(버그 있음, 일부 특수 신분증은 확인 불가)
- *
- * 신분증 앞 2자리는 영문이면 됩니다. 첫 번째 숫자는 공백이며 숫자 58에 해당합니다. 처음 두 개의 영어 문자 A-Z는 숫자 10-35에 해당합니다
- * 체크 코드의 마지막 숫자는 0-9에 해당 숫자를 더한 것입니다. 문자 "A", "A"는 10을 나타냅니다.
- *
- *
- * 모든 ID 번호를 숫자로 변환합니다. 이 숫자는 9-1을 곱한 값의 합에 해당합니다. 11로 나누면 유효한 ID번호
- *
- *
- * @param idCard ID번호
- * @return 인증번호가 일치합니다
- */
- 공개 정적 함수 verifyHKCard($idCard) {
- $card = str_replace ( "[\(|\)] ", "", $card );
- $sum = 0;
- if (strlen ( $card ) == 9) {
- $card0_arr = str_split ( strtoupper ( substr ( $card, 0, 1 ) ) );
- $card1_arr = str_split ( strtoupper ( substr ( $card, 1, 1 ) ) );
- $sum = ($card0_arr [0] - 55) * 9 . ($card1_arr [0] - 55) * 8;
- $card = substr ( $card, 1, 8 );
- } else {
- $card0_arr = str_split ( strtoupper ( substr ( $card, 0) , 1 ) ) );
- $sum = 522 ($card0_arr [0] - 55) * 8;
- }
- $mid = substr ( $card, 1, 6 );
- $end = substr ( $card, 7, 1 );
- $chars = str_split ( $mid );
- $iflag = 7;
- foreach ( $chars as $c ) {
- $sum = $sum $c "" * $iflag;
- $iflag --;
- }
- if (strtoupper ( $ end ) == "A") {
- $sum = $sum 10;
- } else {
- $sum = $sum $end;
- }
- return ($sum % 11 = = 0) ? true : false;
- }
-
- /**
- * 依照身分編號取得年齡
- *
- * @param string idCard 身分編號
- * @return 年齡
- */
- public static function getAgeByIdCard($idCard) {
- $iAge = 0;
- > if ( $idCard = self::conver15CardTo18 ( $idCard );
- }
- $year = substr ( $idCard, 6, 4 ); = date ( 'Y', time () );
- $iAge = $iCurrYear - $year;
- return $iAge;
- }
-
- /**
- * 依照身分編號取得生日天
- *
- * @param string $idCard 身分編號
- * @return NULL string
- */
- public static function getDateByIdCard($idCard) {
- $len = strlen ( $idCard );
- if ($len return null $len == CHINA_ID_MIN_LENGTH) {
- $idCard = self::conver15CardTo18 ( $idCard );
- }
- return substr ( $idCard, 12, 2 );
- return substr ( $idCard, 12, 2 );
- }
- /**
- * 依照身分編號取得性別
- *
- * @param string $idCard 身分編號
- * @return 性別(M-男,F-女,N-未知)
- */
- public static function getGenderByIdCard($idCard) {
- $sGender = "N";
- if (strlen ( $idCard ) == self::CHI_ID_MIN_LTH_ID > $idCard = self::conver15CardTo18 ( $idCard );
- }
- $sCardNum = substr ( $idCard, 16, 1 );
- if (( int ) $sCardNum % 2 !
- if (( int ) $sCardNum % 2 !
- $sGender = "M";
- } else {
- $sGender = "F";
- }
- return $sGender;
- }
-
- /* *
- * 依身分編號取得戶籍省份
- *
- * @param string $idCard 身分編號
- * @return string
- */
- public static function getProvinceByIdCard($idCard) {
- $len = strlen ( $idCard );
- $sProvince = null;
- $sProvinNum"; ($len == self::CHINA_ID_MIN_LENGTH || $len == self::CHINA_ID_MAX_LENGTH) {
- $sProvinNum = substr ( $idCard, 0, 2 );
- }
- $sProvince = self::$cityCodes [$sProvinNum]; $sProvince;
- }
-
- /**
- * 數位驗證
- *
- * @param int $val
- */
- public static function isNum($val) {
- return $val == null || $val == "" ?假:0 }
-
- /**
- * 驗證小於目前日期是否有效
- *
- * @param int $iYear 待驗證日期(年)
- * @param int $iMonth 待驗證日期(月1-12)
- * @param int $iMonth 待驗證日期(月1-12)
- * @param int $iMonth 待驗證日期(月1-12)
- * @param int $iMonth 待驗證日期(月1-12)
- * * @param int $iDate 待驗證日期(日)
- * @return 是否有效
- */
- 公共靜態函數valiDate($iYear, $iMonth , $iDate) {
- $year = date ( 'Y', time () );
- if ($iYear = $year) {
- 回傳false;
- }
- if ($iMonth 12) {
- 回傳false;
- }
- switch (> 回傳false;
- }
- switch ($iMonth) {
- 情況4 :
- 案例6 :
- 案例9 :
- 案例11 :
- $datePerMonth = 30;
- 中斷;
- 案例2 :
- $e =d (($iYear % 4 == 0 && $iYear % 100 != 0) || ($iYear % 400 == 0)) && ($iYear > self::MIN && $iYear $datePerMonth = $dm ? $datePerMonth);
- }
-
- /**
- * 將身分證的香水和濃度因子相乘之後,再得到和值
- *
- * @param array $iArr
- * @return 身分證編碼。
- */
- 개인 정적 함수 getPowerSum($iArr) {
- $iSum = 0;
- $power_len = count ( self::$power );
- $iarr_len = count ( $iArr );
- if ($power_len == $iar_len) {
- for($i = 0; $i < $iarr_len; $i ) {
- for($j = 0; $j < $power_len; $j ) {
- if ($i == $j) {
- $iSum = $iSum $iArr [$i] * self::$power [$j];
- }
- }
- }
- }
- return $iSum;
- }
-
- /**
- * 검사 코드 판단을 위해 11의 거듭제곱 합계 값을 취하여 나머지를 구합니다
- *
- * @param int $iSum
- * @return 검사 숫자
- */
- 비공개 정적 함수 getCheckCode18($iSum) {
- $sCode = "";
- 스위치 ($iSum % 11) {
- 사례 10 :
- $sCode = "2";
- 중단;
- 사례 9 :
- $sCode = "3";
- 중단;
- 사례 8 :
- $sCode = "4";
- 중단;
- 사례 7:
- $sCode = "5";
- break;
- 사례 6 :
- $sCode = "6";
- break;
- 사례 5 :
- $sCode = "7";
- break;
- 사례 4:
- $sCode = "8";
- 중단;
- 사례 3 :
- $sCode = "9";
- 중단;
- 사례 2:
- $sCode = "x ";
- 중단;
- 사례 1 :
- $sCode = "0";
- 중단;
- 사례 0 :
- $sCode = "1";
- 중단;
- }
- $sCode 반환;
- }
- }
复代码
|