喜悦国际村 » 代码共享 » 身份证批量转换18位,带18位验证

页: [1]
jdiqssu2006-3-15 01:23 PM
身份证批量转换18位,带18位验证

有身份证的数据表中大部分混合着18位和15位身份证号码,网上有一些软件能做到批量处理但是要收费,我自己就写了一个,由于经验不足,可能转换时有点慢且语句不够简练,但转换出来的数据没有问题,我测试过。部分代码来源于网上,感谢不知名的网友,请诸位给优化一下。对了请问如何添加成附件?另一个代码太长了。

[php]
<?php
//
// +----------------------------------------------------------------------+
// | 本文件名 id_plcl.php                                                             |
// +----------------------------------------------------------------------+
// | 说明:从一个混合15和18位身份证信息的文本文件中批量转换出全部是18位身 |
// |       份证的文本文件                                                 |
// | 要求:源文件为:  姓名|身份证号                                      |
// | 结果:目标文件为:姓名|身份号号|性别|出生日期|最初办证地|            |
// |                                                                      |
// +----------------------------------------------------------------------+
// | 创建时间:2005年8月7日                  最后修改时间:2006年3月7日   |
// +----------------------------------------------------------------------+
// | PHP Version 4.12 下测试通过                             (\-/)          |
// +--------------------------------------------- - - ------ ={   }= --------+
// | Copyright (c) 1997-2002 The PHP Group               ) (           |
// +--------------------------------------------------    --- _/   \_ --------+
//                                                                                \     /  
//                                                                               `-))'   
//                                                                                 ((     
//                                                                                  \)   
//
require ("mycheckidcard.php");
$line = file("XXX.txt");             //以方式打开文件,请改成你的文件!
$j = count($line);                  //计数
for ($i=0; $i<$j; $i++ )
{
    list($name[$i],$id[$i]) = explode("|",$line[$i]);
        $name[$i] = trim($name[$i]);
        $id[$i]   = trim($id[$i]);
        $id_len[$i]=strlen($id[$i]);    //获得身份证长度。

        //*****1、分解为15位和18位及不合格的。*****//
        if (($id_len[$i] !== 15) && ($id_len[$i] !== 18))
        {
        $newline[$i] = $name[$i]."|".$id[$i]."|位数错\n";
        $fp = fopen("id_err.txt","a");
        fputs($fp,$newline[$i]);
        fclose($fp);
        echo "位数错<BR>\n";
        }
       
        if($id_len[$i] == 15)
        {
            $date_y_15  =  "19" . substr($id[$i],6,2);
                $date_m_15  =  substr($id[$i],8,2);
                $date_d_15  =  substr($id[$i],10,2);
               
                if (!checkdate($date_m_15,$date_d_15,$date_y_15))
                {
                        $newline[$i] = $name[$i]."|".$id[$i]."|日期错误!\n";
                        $fp = fopen("id_err.txt","a");
                        fputs($fp,$newline[$i]);
                        fclose($fp);
                echo "日期错误!<BR>\n";
                }
                else          //升级15位身份证为18位。
                {       
                        $id_6     = substr($id[$i], 0, 6);
                        $sigma    = 0;
                        $body     = $id_6 . $date_y_15 . $date_m_15 . $date_d_15 . substr($id[$i],12,3);
                        $wi       = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
                        $ai       = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');

                        for ($a = 0;$a < 17;$a++)
                        {
                        $sigma += ((int) $body{$a}) * $wi[$a];
                        }
                        $id[$i]= $body.$ai[($sigma % 11)];
                        $sex[$i]  = ($id[$i]{16}) % 2 ? "男" : "女";
                        $xzq[$i]  = xinzhengqu($id_6);
                        $sr[$i]   = substr($id[$i],6,4) . "-" . substr($id[$i],10,2) . "-" . substr($id[$i],12,2);
               
                        $newline[$i] = $id[$i]."|".$name[$i]."|".$sex[$i]."|".$sr[$i]."|".$xzq[$i]."|\n";
                        $fp = fopen("id_ok.txt","a");
                        fputs($fp,$newline[$i]);
                }
        }

        if($id_len[$i] == 18)
                {
                        $date_y  =  substr($id[$i],6,4);
                        $date_m  =  substr($id[$i],10,2);
                        $date_d  =  substr($id[$i],12,2);
               
                        if (!checkdate($date_m,$date_d,$date_y))
                        {
                                $newline[$i] = $name[$i]."|".$id[$i]."|日期错误!\n";
                                $fp = fopen("id_err.txt","a");
                                fputs($fp,$newline[$i]);
                                fclose($fp);
                        }
                        else
                        {
                                $sigma    = 0;
                                $body     = substr($id[$i],0,17);
                                $wi = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
                                $ai = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
                                for ($a = 0;$a < 17;$a++)
                                {
                                        $sigma += ((int) $body{$a}) * $wi[$a];
                                }
                                $jyw = $ai[($sigma % 11)];

                                if ($id[$i]{17} <> $jyw)
                                {               
                                        $newline[$i] = $name[$i]."|".$id[$i]."|校验位错\n";
                                        $fp = fopen("id_err.txt","a");
                                        fputs($fp,$newline[$i]);
                                echo "校验位错<BR>\n";
                                }
                                else
                                {
                                $id_6 = substr($id[$i],0,6);
                                $sex[$i]  = ($id[$i]{16}) % 2 ? "男" : "女";
                                $xzq[$i]  = xinzhengqu($id_6);
                                $sr[$i]   = substr($id[$i],6,4) . "-" . substr($id[$i],10,2) . "-" . substr($id[$i],12,2);
                                $newline[$i] = $id[$i]."|".$name[$i]."|".$sex[$i]."|".$sr[$i]."|".$xzq[$i]."|\n";
                                $fp = fopen("id_ok.txt","a");
                                fputs($fp,$newline[$i]);
                                }
                               
                        }
                }
}
?>
[/php]

xzzyzdc2006-9-22 01:26 PM
顶..............................


查看完整版本: 身份证批量转换18位,带18位验证


Powered by Discuz! Archiver 6.1.0  © 2001-2006 Comsenz Inc.
Processed in 0.006528 second(s), 2 queries