PHP VIN号码验证码

Opt*_*mus 18 php validation vin

有谁知道用PHP编写的任何Vehicle Identification Number(wiki)验证代码?我只需要检查输入的vin号是否正确?

jor*_*ens 25

以下是我使用维基百科文章中的示例快速编写的内容.

不保证完美或无bug或超高效,但应为您提供一个坚实的起点:

注意:我在下面的Confluence中提供了编辑,使程序稍微简洁一些.

function validate_vin($vin) {

    $vin = strtolower($vin);
    if (!preg_match('/^[^\Wioq]{17}$/', $vin)) { 
        return false; 
    }

    $weights = array(8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2);

    $transliterations = array(
        "a" => 1, "b" => 2, "c" => 3, "d" => 4,
        "e" => 5, "f" => 6, "g" => 7, "h" => 8,
        "j" => 1, "k" => 2, "l" => 3, "m" => 4,
        "n" => 5, "p" => 7, "r" => 9, "s" => 2,
        "t" => 3, "u" => 4, "v" => 5, "w" => 6,
        "x" => 7, "y" => 8, "z" => 9
    );

    $sum = 0;

    for($i = 0 ; $i < strlen($vin) ; $i++ ) { // loop through characters of VIN
        // add transliterations * weight of their positions to get the sum
        if(!is_numeric($vin{$i})) {
            $sum += $transliterations[$vin{$i}] * $weights[$i];
        } else {
            $sum += $vin{$i} * $weights[$i];
        }
    }

    // find checkdigit by taking the mod of the sum

    $checkdigit = $sum % 11;

    if($checkdigit == 10) { // checkdigit of 10 is represented by "X"
        $checkdigit = "x";
    }

    return ($checkdigit == $vin{8});
}
Run Code Online (Sandbox Code Playgroud)

注意:由于校验和的性质,验证VIN的误差很小:

......匹配并不能证明VIN是正确的,因为任何两个不同的VIN都有一个匹配校验位的可能性为1/11.

另请注意:11111111111111111将根据上述程序进行验证.您是否要检查是否取决于您:

直的(连续17个'1')就足够了.这是因为值为1乘以89(权重之和)仍为89.而89%11为1,即校验位.这是测试VIN检查算法的简便方法.

参考:http://en.wikipedia.org/wiki/Vehicle_identification_number#Check_digit_calculation

  • 尊重在某种程度上鞭打的东西.+5如果可以的话. (6认同)
  • 我在大约 30 分钟内有一个离散数学/算法考试,我认为让我的头脑转动不会有什么坏处。:) (2认同)

小智 6

这是jordan移植到Javascript的代码版本,希望它对某人有帮助...

function validate_vin(vin)
{
  function isnumeric(mixed_var) {
    return (typeof(mixed_var) === 'number' || typeof(mixed_var) === 'string') && mixed_var !== '' && !isNaN(mixed_var);
  }
  var pattern = /^[^\Wioq]{17}$/;
  var weights = Array(8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2);
  var transliterations = {
    "a" : 1, "b" : 2, "c" : 3, "d" : 4,
    "e" : 5, "f" : 6, "g" : 7, "h" : 8,
    "j" : 1, "k" : 2, "l" : 3, "m" : 4,
    "n" : 5, "p" : 7, "r" : 9, "s" : 2,
    "t" : 3, "u" : 4, "v" : 5, "w" : 6,
    "x" : 7, "y" : 8, "z" : 9
  };

  vin = vin.toLowerCase();
  if(!vin.match(pattern)) { return false; }

  var sum = 0;
  for(var i=0; i<vin.length; i++) {
    if(!isnumeric(vin.charAt(i))) {
      sum += transliterations[vin.charAt(i)] * weights[i];
    } else {
      sum += parseInt(vin.charAt(i)) * weights[i];
    }  
  }

  var checkdigit = sum % 11;
  if(checkdigit == 10) { // check digit of 10 represented by X
    checkdigit = 'x';
  }

  return (checkdigit == vin.charAt(8));
}
Run Code Online (Sandbox Code Playgroud)