, - () , ( WMI->Init()). , , VINLookup WMI ( - 33, []).
define('VIN_CHARACTERS', 'ABCDEFGHJKLMNPRSTUVWXYZ1234567890');
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)
{
$code = substr($vin,0,2);
$_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);
}
}
:
VINLookup::IsValid(<vin>);
$lookup = new VINLookup(<vin>);
$lookup->GetCountry();