2011-06-01 91 views
3

有没有人知道在PHP,或Perl,或Python(或任何其他语言,我可以轻松转换代码)的ISO 3779汽车VIN解码器库作为开源/免费软件提供?ISO 3779车辆VIN解码器在PHP?

即使只是解码WMI部分(前3个位置),也会为我节省很多时间。提前致谢。

http://en.wikipedia.org/wiki/Vehicle_identification_number

+0

看起来WMI实际上是由ISO维护的一个列表。你可以很容易地找出哪个国家(使用wiki页面),但知道没有这个列表的确切制造商是不可能的。这个网站已经有一个VIN查询,但它是一个CGI:http://www.analogx.com/cgi-bin/cgivin.exe?Mode=Decode&VIN=SCCFE33C9VHF65358&Submit=Decode – James 2011-06-01 20:25:01

+0

虽然它不是PHP,但您可能会对https ://pypi.python.org/pypi/vin_decoder – 2015-03-21 15:58:25

回答

1

美国国家公路交通安全管理局具有所有WMI号码的数据库。这里是一个链接到相关网页:NHTSA WMI Data

他们引用ftp站点包含数据:WMI Data Source

您也可以下载565.txt文件或包含数据的MDB数据库。这似乎是一个非常完整的数据库。

4

我会让你从维基百科凑数据,但下面是一个快速(模块化),样品可以在扩大(玩完WMI->Init()方法)。我也可能使VINLookup类成为一个singleton或将WMI中断到数据库中(将数据标准化到某个地方并将其视为像我[可能]那样的基数为33的数字)。

// http://en.wikipedia.org/wiki/Vehicle_identification_number#World_Manufacturer_Identifier 

define('VIN_CHARACTERS', 'ABCDEFGHJKLMNPRSTUVWXYZ1234567890'); // no I, O or Q & 0 is last. 

class WMI 
{ 
    public $country; 
    public $region; 
    public $low; 
    public $high; 

    public function __construct($country,$region,$low,$high) 
    { 
    $this->country = $country; 
    $this->region = $region; 
    $this->low = $low; 
    $this->high = $high; 
    } 

    private static function CodeToDec($code) 
    { 
    if (strlen($code) != 2) 
     return false; 

    return (strpos(VIN_CHARACTERS, $code{0}) * strlen(VIN_CHARACTERS)) + strpos(VIN_CHARACTERS, $code{1}); 
    } 

    public function IsMatch($vin) 
    { 
    // first, grab the first 2 characters 
    $code = substr($vin,0,2); 

    // next, see if it's in range 
    // we do this by converting it to a numeric 
    $_low = WMI::CodeToDec($this->low); 
    $_high = WMI::CodeToDec($this->high); 
    $_code = WMI::CodeToDec($code); 

    return (($_code >= $_low) && ($_code <= $_high)); 
    } 

    public function __toString() 
    { 
    return sprintf("%s, %s (%s, %s)", $this->country, $this->region, $this->low, $this->high); 
    } 
} 

class VINLookup 
{ 
    private $vin; 
    private $wmis = array(); 

    public function __construct($vin) 
    { 
    if (!VINLookup::IsValid($vin)) 
     throw new Exception('Invalid VIN specified'); 

    $this->vin = $vin; 

    $this->Init(); 
    } 

    private function Init() 
    { 
    $this->wmis = array(
     new WMI('South Africa',  'Africa',   'AA', 'AH'), 
     new WMI('Ivory Coast',  'Africa',   'AJ', 'AN'), 
     new WMI('(not assigned)', 'Africa',   'AP', 'A0'), 
     new WMI('Angola',   'Africa',   'BA', 'BE'), 
     new WMI('Kenya',   'Africa',   'BF', 'BK'), 

     new WMI('United States', 'North America', '1A', '10'), 
     new WMI('Canada',   'North America', '2A', '20'), 
     new WMI('Mexico',   'North America', '3A', '3W'), 
     new WMI('Costa Rica',  'North America', '3X', '37'), 
    ); 
    } 

    public function GetCountry() 
    { 
    foreach ($this->wmis as $wmi) 
    { 
     if ($wmi->IsMatch($this->vin)) 
     return $wmi; 
    } 
    return false; 
    } 

    public static function IsValid($vin) 
    { 
    return preg_match('/^[A-HJ-NPR-Z0-9]{17}$/',$vin); 
    } 
} 

用法:

// check for a valid VIN number supplied 
VINLookup::IsValid(<vin>); 


// create a new VINLookup with the specified VIN 
$lookup = new VINLookup(<vin>); 

// retrieve the _Country_ object (above), or FALSE if no country match was found. 
$lookup->GetCountry();