首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何验证VIN号码?

如何验证VIN号码?
EN

Stack Overflow用户
提问于 2010-09-30 22:51:30
回答 7查看 17.9K关注 0票数 20

如何使用PHP验证Vehicle Identification Number?我只需要检查一下输入的VIN号码是否正确。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-09-30 23:22:52

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

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

注释:我在下面包含了Confluence提供的编辑,使该过程稍微更简洁一些。

代码语言:javascript
复制
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});
}

注意::由于校验和的性质,验证VIN时会有一个小的百分比误差:

...a匹配不能证明车辆识别码是正确的,因为任何两个不同的车辆识别码仍有1/ 11的概率具有匹配的校验位。

还请注意11111111111111111将根据上面的过程进行验证。您是否想要检查它取决于您:

-1(17个连续的‘1’)将满足校验位。这是因为1乘以89 (权重和)的值仍然是89。89%11是1,校验位。这是测试VIN码校验算法的一种简单方法。

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

票数 25
EN

Stack Overflow用户

发布于 2011-11-12 12:23:24

这里有一个由jordan移植到Javascript的代码版本,希望它对某些人有帮助…

代码语言: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));
}
票数 7
EN

Stack Overflow用户

发布于 2010-09-30 22:54:04

是“VIN”"VIN Number“=”车辆识别号码“,这是没有意义的。

你可以在这里看到VIN结构的定义:

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

你可以从那里开始工作,或者你可以在这里获取这个脚本:

http://www.geekpedia.com/code29_Check-if-VIN-number-is-valid.html

以下是jordan发布的函数的改进版本:

代码语言:javascript
复制
$vin = "1M8GDM9AXKP042788";

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});
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3831764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档