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