Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 1980年前和1980年后的正则表达式Vin验证_Javascript_Jquery_Regex - Fatal编程技术网

Javascript 1980年前和1980年后的正则表达式Vin验证

Javascript 1980年前和1980年后的正则表达式Vin验证,javascript,jquery,regex,Javascript,Jquery,Regex,1981年,使用17位数字系统对车辆识别号VIN进行了标准化。1981年之前,制造商使用其公司独有的VIN,这些编号没有公认的标准,因此不同的制造商使用不同的格式。。 它要求销售的所有道路车辆都包含17个字符的VIN,其中不包括字母I、O或Q,以避免与数字1和0混淆。 因此,我试图实现的是一个下拉列表,如果选择1980-1900之间的任何地方,VIN将遵循制造商的指南,或者根本不适用于可以使用字母I、O或Q以及任意数量的字符/数字的地方。但是,如果选择1981年及更高版本,则RegEx将启动

1981年,使用17位数字系统对车辆识别号VIN进行了标准化。1981年之前,制造商使用其公司独有的VIN,这些编号没有公认的标准,因此不同的制造商使用不同的格式。。

它要求销售的所有道路车辆都包含17个字符的VIN,其中不包括字母I、O或Q,以避免与数字1和0混淆。

因此,我试图实现的是一个下拉列表,如果选择1980-1900之间的任何地方,VIN将遵循制造商的指南,或者根本不适用于可以使用字母I、O或Q以及任意数量的字符/数字的地方。但是,如果选择1981年及更高版本,则RegEx将启动,并要求它使用表达式进行格式化,该表达式显示有效或无效的VIN

暂时插入有效的VIN以进行测试。。如果删除最后一个号码,它将显示无效的Vin

如有任何建议或帮助,将不胜感激

正则表达式

^[A-HJ-NPR-Z\\d]{8}[\\dX][A-HJ-NPR-Z\\d]{2}\\d{6}$
jQuery Vin验证器

    $(function() {
  $("#vin").on("keyup blur", function() {
    if (validateVin($("#vin").val())) {
      $("#result").css('color', 'green').html("Valid VIN");
      $("#vin").removeClass("not-ok").addClass("ok");
    } else {
      $("#result").css('color', 'red').html("Invalid VIN");
      $("#vin").removeClass("ok").addClass("not-ok");
    }
  });
});


function validateVin(vin) {
  var re = new RegExp("^[A-HJ-NPR-Z\\d]{8}[\\dX][A-HJ-NPR-Z\\d]{2}\\d{6}$");
  return vin.match(re);
}
HTML

用于测试目的的下拉列表

<select name="vehicleyear" id="vehicleyear">
    <option value="">Choose Year</option>
    <option value="1985">1985</option>
    <option value="1984">1984</option>
    <option value="1983">1983</option>
    <option value="1982">1982</option>
    <option value="1981">1981</option>
    <option value="1980">1980</option>
    <option value="1979">1979</option>
    <option value="1978">1978</option>
    <option value="1977">1977</option>
    <option value="1976">1976</option>
    <option value="1975">1975</option>
    <option value="1974">1974</option>
</select>
实际下拉列表

<cfparam name="form.vehicleyear" default="">

<cfset VARIABLES.y1=DatePart("yyyy",Now())>
<cfset VARIABLES.y2=VARIABLES.y1+2>

<cfif Val(form.vehicleyear) LT VARIABLES.y1 or Val(form.vehicleyear) GT VARIABLES.y2>
</cfif>

 <cfoutput>
    <cfselect name="vehicleyear" id="vehicleyear" required="yes" message="Please select vehicle year.">
    <option value="" selected="selected">Select Year</option>
    <cfloop index="i" from="#VARIABLES.y2#" to="1900" step="-1">
    <option value="#i#"<cfif form.vehicleyear EQ i> selected</cfif>>#NumberFormat(i,"0000")#</option>
    </cfloop>
    </cfselect>
 </cfoutput>

我不会为您开发regexp,但总体模式应该是这样的:

$(function() {
    $("#vin").on("keyup blur", function() {
        if ( validateVin( this.value, Number($("#vehicleyear").val()) ) ) {
            $("#result").css('color', 'green').html("Valid VIN");
            $("#vin").removeClass("not-ok").addClass("ok");
        } else {
            $("#result").css('color', 'red').html("Invalid VIN");
            $("#vin").removeClass("ok").addClass("not-ok");
        }
    });
    function validateVin(vin, date) {
        if(date > 1980) {
            var re = new RegExp("^[A-HJ-NPR-Z\\d]{8}[\\dX][A-HJ-NPR-Z\\d]{2}\\d{6}$");
            return vin.match(re);
        } else {
            //Pre validation are rules to complex. We are forced to assume the vin is valid.
            //Though really at least a simple test would be preferable - eg vin.length >= 20 or whatever
            return true;
        }
    }
});

请注意,vin和日期被传递给validateVin,从而允许代码分支。

您将有一段很长的时间通过正则表达式验证1981-vin上的校验位。我强烈推荐作为这个主题的参考。你真的是指1980-1900年吗?基本上是1980年-第一辆汽车有史以来作出哈哈哈。。。我不能错过一年,是的,我知道T型车在1908年首次亮相:尽管许多人认为德国的卡尔·本茨在1885/1886年创造了第一辆真正的汽车。我很惊讶这不是人们蜂拥学习的话题;heheI没有尝试渗透验证规则,但可能是你所说的;您的RegExp如果正确,将应用于其中一个分支和其他一些RegExp或其他任何将应用于另一个分支的东西。是的,但是您没有验证1980年后的VIN。当然,您想同时验证前和后版本?关于no Is或Os规则,它不适用于1980年前和1980年后版本吗?好的,那么您的RegExp适用于1980年后版本,并且您被迫假设所有1980年前版本都是可以的?让我们来看看。
$(function() {
    $("#vin").on("keyup blur", function() {
        if ( validateVin( this.value, Number($("#vehicleyear").val()) ) ) {
            $("#result").css('color', 'green').html("Valid VIN");
            $("#vin").removeClass("not-ok").addClass("ok");
        } else {
            $("#result").css('color', 'red').html("Invalid VIN");
            $("#vin").removeClass("ok").addClass("not-ok");
        }
    });
    function validateVin(vin, date) {
        if(date > 1980) {
            var re = new RegExp("^[A-HJ-NPR-Z\\d]{8}[\\dX][A-HJ-NPR-Z\\d]{2}\\d{6}$");
            return vin.match(re);
        } else {
            //Pre validation are rules to complex. We are forced to assume the vin is valid.
            //Though really at least a simple test would be preferable - eg vin.length >= 20 or whatever
            return true;
        }
    }
});