日期:2011-08-01 浏览次数:20560 次
<?php
/**
* 身份证工具类
*
* @author Tongle Xu <xutongle@gmail.com> 2013-6-6
* @copyright Copyright (c) 2003-2103 tintsoft.com
* @license http://www.php100.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 );
/**
* 第18位校检码
*/
public static $verifyCode = array ("1","0","X","9","8","7","6","5","4","3","2" );
/**
* 国内身份证校验
*/
public static $cityCodes = array ('11' => '北京' );
/**
* 将15位身份证号码转换为18位
*
* @param idCard 15位身份编码
* @return 18位身份编码
*/
public static function conver15CardTo18($idCard) {
$idCard18 = "";
if (strlen ( $idCard ) != self::CHINA_ID_MIN_LENGTH) {
return null;
}
if (self::isNum ( $idCard )) {
// 获取出生年月日
$sYear = '19' . substr ( $idCard, 6, 2 );
$idCard18 = substr ( $idCard, 0, 6 ) . $sYear . 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;
}
/**
* 验证身份证是否合法
*/
public static function validateCard($idCard) {
$card = trim ( $idCard );
if (self::validateIdCard18 ( $card )) {
return true;
}
if (self::validateIdCard15 ( $card )) {
return true;
}
return false;
}
/**
* 验证18位身份编码是否合法
*
* @param int $idCard 身份编码
* @return boolean 是否合法
*/
public static function validateIdCard18($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 是否合法
*/
public static function validateIdCard15($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;
}
/**
* 根据身份编号获取年龄
*
* @param string idCard 身份编号
* @return 年龄
*/
public static function getAgeByIdCard($idCard) {
$iAge = 0;
if (strlen ( $idCard ) == self::CHINA_ID_MIN_LENGTH) {
$idCard = self::conver15CardTo18 ( $idCard );
}
$year = substr ( $idCard, 6, 4 );
$iCurrYear = date ( 'Y', time () );
$iAge = $iCurrYear - $year;
return $iAge;
}
/**
* 根据身份编号获取生日天
*
* @param string $idCard 身份编号
* @return NULL string
*/
public static functi