PHP中的ISO 3779车辆VIN解码器


ISO 3779 vehicle VIN decoder in PHP?

有人知道PHP、Perl或Python(或任何其他语言,我可以很容易地转换代码)中的ISO 3779车辆VIN解码器库作为开源/免费软件提供吗?

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

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

我会让你从维基百科中抓取数据,但下面是一个可以扩展的快速(模块化)示例(完成WMI->Init()方法)。我也可能会让VINLookup类成为一个单例,或者将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();

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

它们引用了包含以下数据的ftp站点:WMI数据源

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