PHP的身份证号码工具类翻译的那个Java的

php教程评论473 views阅读模式
实现从15位~18位的身份证号码转换,校验中国大陆居民身份证、香港居民身份证、澳门身份证和台湾身份证。

  1. /**
  2. * 身份证工具类
  3. *
  4. * @author Tongle Xu 2013-6-6
  5. * @copyright Copyright (c) 2003-2103 tintsoft.com
  6. * @license http://www.tintsoft.com
  7. * @version $Id$
  8. */
  9. class Utils_Idcard {
  10. /**
  11. * 中国公民身份证号码最小长度。
  12. */
  13. const CHINA_ID_MIN_LENGTH = 15;
  14. /**
  15. * 中国公民身份证号码最大长度。
  16. */
  17. const CHINA_ID_MAX_LENGTH = 18;
  18. /**
  19. * 最低年限
  20. */
  21. const MIN = 1930;
  22. /**
  23. * 省、直辖市代码表
  24. */
  25. 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" );
  26. /**
  27. * 每位加权因子
  28. */
  29. public static $power = array (7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2 );
  30. /**
  31. * 第18位校检码
  32. */
  33. public static $verifyCode = array ("1","0","X","9","8","7","6","5","4","3","2" );
  34. /**
  35. * 国内身份证校验
  36. */
  37. public static $cityCodes = array ('11' => '北京' );
  38. /**
  39. * 将15位身份证号码转换为18位
  40. *
  41. * @param idCard 15位身份编码
  42. * @return 18位身份编码
  43. */
  44. public static function conver15CardTo18($idCard) {
  45. $idCard18 = "";
  46. if (strlen ( $idCard ) != self::CHINA_ID_MIN_LENGTH) {
  47. return null;
  48. }
  49. if (self::isNum ( $idCard )) {
  50. // 获取出生年月日
  51. $sYear = '19' . substr ( $idCard, 6, 2 );
  52. $idCard18 = substr ( $idCard, 0, 6 ) . $sYear . substr ( $idCard, 8 );
  53. // 转换字符数组
  54. $iArr = str_split ( $idCard18 );
  55. if ($iArr != null) {
  56. $iSum17 = self::getPowerSum ( $iArr );
  57. // 获取校验位
  58. $sVal = self::getCheckCode18 ( $iSum17 );
  59. if (strlen ( $sVal ) > 0) {
  60. $idCard18 .= $sVal;
  61. } else {
  62. return null;
  63. }
  64. }
  65. } else {
  66. return null;
  67. }
  68. return $idCard18;
  69. }
  70. /**
  71. * 验证身份证是否合法
  72. */
  73. public static function validateCard($idCard) {
  74. $card = trim ( $idCard );
  75. if (self::validateIdCard18 ( $card )) {
  76. return true;
  77. }
  78. if (self::validateIdCard15 ( $card )) {
  79. return true;
  80. }
  81. return false;
  82. }
  83. /**
  84. * 验证18位身份编码是否合法
  85. *
  86. * @param int $idCard 身份编码
  87. * @return boolean 是否合法
  88. */
  89. public static function validateIdCard18($idCard) {
  90. $bTrue = false;
  91. if (strlen ( $idCard ) == self::CHINA_ID_MAX_LENGTH) {
  92. // 前17位
  93. $code17 = substr ( $idCard, 0, 17 );
  94. // 第18位
  95. $code18 = substr ( $idCard, 17, 1 );
  96. if (self::isNum ( $code17 )) {
  97. $iArr = str_split ( $code17 );
  98. if ($iArr != null) {
  99. $iSum17 = self::getPowerSum ( $iArr );
  100. // 获取校验位
  101. $val = self::getCheckCode18 ( $iSum17 );
  102. if (strlen ( $val ) > 0 && $val == $code18) {
  103. $bTrue = true;
  104. }
  105. }
  106. }
  107. }
  108. return $bTrue;
  109. }
  110. /**
  111. * 验证15位身份编码是否合法
  112. *
  113. * @param string $idCard 身份编码
  114. * @return boolean 是否合法
  115. */
  116. public static function validateIdCard15($idCard) {
  117. if (strlen ( $idCard ) != self::CHINA_ID_MIN_LENGTH) {
  118. return false;
  119. }
  120. if (self::isNum ( $idCard )) {
  121. $proCode = substr ( $idCard, 0, 2 );
  122. if (! isset ( self::$cityCodes [$proCode] )) {
  123. return false;
  124. }
  125. //升到18位
  126. $idCard = self::conver15CardTo18($idCard);
  127. return self::validateIdCard18($idCard);
  128. } else {
  129. return false;
  130. }
  131. return true;
  132. }
  133. /**
  134. * 根据身份编号获取年龄
  135. *
  136. * @param string idCard 身份编号
  137. * @return 年龄
  138. */
  139. public static function getAgeByIdCard($idCard) {
  140. $iAge = 0;
  141. if (strlen ( $idCard ) == self::CHINA_ID_MIN_LENGTH) {
  142. $idCard = self::conver15CardTo18 ( $idCard );
  143. }
  144. $year = substr ( $idCard, 6, 4 );
  145. $iCurrYear = date ( 'Y', time () );
  146. $iAge = $iCurrYear - $year;
  147. return $iAge;
  148. }
  149. /**
  150. * 根据身份编号获取生日天
  151. *
  152. * @param string $idCard 身份编号
  153. * @return NULL string
  154. */
  155. public static function getDateByIdCard($idCard) {
  156. $len = strlen ( $idCard );
  157. if ($len < self::CHINA_ID_MIN_LENGTH) {
  158. return null;
  159. } else if ($len == CHINA_ID_MIN_LENGTH) {
  160. $idCard = self::conver15CardTo18 ( $idCard );
  161. }
  162. return substr ( $idCard, 12, 2 );
  163. }
  164. /**
  165. * 根据身份编号获取性别
  166. *
  167. * @param string $idCard 身份编号
  168. * @return 性别(M-男,F-女,N-未知)
  169. */
  170. public static function getGenderByIdCard($idCard) {
  171. $sGender = "N";
  172. if (strlen ( $idCard ) == self::CHINA_ID_MIN_LENGTH) {
  173. $idCard = self::conver15CardTo18 ( $idCard );
  174. }
  175. $sCardNum = substr ( $idCard, 16, 1 );
  176. if (( int ) $sCardNum % 2 != 0) {
  177. $sGender = "M";
  178. } else {
  179. $sGender = "F";
  180. }
  181. return $sGender;
  182. }
  183. /**
  184. * 根据身份编号获取户籍省份
  185. *
  186. * @param string $idCard 身份编号
  187. * @return string
  188. */
  189. public static function getProvinceByIdCard($idCard) {
  190. $len = strlen ( $idCard );
  191. $sProvince = null;
  192. $sProvinNum = "";
  193. if ($len == self::CHINA_ID_MIN_LENGTH || $len == self::CHINA_ID_MAX_LENGTH) {
  194. $sProvinNum = substr ( $idCard, 0, 2 );
  195. }
  196. $sProvince = self::$cityCodes [$sProvinNum];
  197. return $sProvince;
  198. }
  199. /**
  200. * 数字验证
  201. *
  202. * @param int $val
  203. */
  204. public static function isNum($val) {
  205. return $val == null || $val == "" ? false : 0 < preg_match ( '/^[0-9]*$/', $val );
  206. }
  207. /**
  208. * 验证小于当前日期 是否有效
  209. *
  210. * @param int $iYear 待验证日期(年)
  211. * @param int $iMonth 待验证日期(月 1-12)
  212. * @param int $iDate 待验证日期(日)
  213. * @return 是否有效
  214. */
  215. public static function valiDate($iYear, $iMonth, $iDate) {
  216. $year = date ( 'Y', time () );
  217. if ($iYear < self::MIN || $iYear >= $year) {
  218. return false;
  219. }
  220. if ($iMonth < 1 || $iMonth > 12) {
  221. return false;
  222. }
  223. switch ($iMonth) {
  224. case 4 :
  225. case 6 :
  226. case 9 :
  227. case 11 :
  228. $datePerMonth = 30;
  229. break;
  230. case 2 :
  231. $dm = (($iYear % 4 == 0 && $iYear % 100 != 0) || ($iYear % 400 == 0)) && ($iYear > self::MIN && $iYear < $year);
  232. $datePerMonth = $dm ? 29 : 28;
  233. break;
  234. default :
  235. $datePerMonth = 31;
  236. }
  237. return ($iDate >= 1) && ($iDate <= $datePerMonth);
  238. }
  239. /**
  240. * 将身份证的每位和对应位的加权因子相乘之后,再得到和值
  241. *
  242. * @param array $iArr
  243. * @return 身份证编码。
  244. */
  245. private static function getPowerSum($iArr) {
  246. $iSum = 0;
  247. $power_len = count ( self::$power );
  248. $iarr_len = count ( $iArr );
  249. if ($power_len == $iarr_len) {
  250. for($i = 0; $i < $iarr_len; $i ++) {
  251. for($j = 0; $j < $power_len; $j ++) {
  252. if ($i == $j) {
  253. $iSum = $iSum + $iArr [$i] * self::$power [$j];
  254. }
  255. }
  256. }
  257. }
  258. return $iSum;
  259. }
  260. /**
  261. * 将power和值与11取模获得余数进行校验码判断
  262. *
  263. * @param int $iSum
  264. * @return 校验位
  265. */
  266. private static function getCheckCode18($iSum) {
  267. $sCode = "";
  268. switch ($iSum % 11) {
  269. case 10 :
  270. $sCode = "2";
  271. break;
  272. case 9 :
  273. $sCode = "3";
  274. break;
  275. case 8 :
  276. $sCode = "4";
  277. break;
  278. case 7 :
  279. $sCode = "5";
  280. break;
  281. case 6 :
  282. $sCode = "6";
  283. break;
  284. case 5 :
  285. $sCode = "7";
  286. break;
  287. case 4 :
  288. $sCode = "8";
  289. break;
  290. case 3 :
  291. $sCode = "9";
  292. break;
  293. case 2 :
  294. $sCode = "x";
  295. break;
  296. case 1 :
  297. $sCode = "0";
  298. break;
  299. case 0 :
  300. $sCode = "1";
  301. break;

复制代码 复制代码

企鹅博客
  • 本文由 发表于 2020年9月12日 21:17:31
  • 转载请务必保留本文链接:https://www.qieseo.com/316182.html

发表评论