2014-10-27 15 views
5

Nel 1981, i numeri di identificazione del veicolo (VIN) sono stati standardizzati utilizzando un sistema di diciassette cifre. Prima del 1981, i produttori utilizzati VIN unica per la propria azienda e non c'era standard accettato per questi numeri, in modo da diversi produttori utilizzati formati differenti .. http://www.crankshaftcoalition.com/wiki/VIN_decodingRegEx Vin Validation per pre 1980 e post 1980

E 'richiesto a tutti over-the-road-veicoli venduti a contenere un VIN di 17 caratteri, che non include le lettere I (i), O (o) o Q (q) (per evitare confusione con i numeri 1 e 0). http://en.wikipedia.org/wiki/Vehicle_identification_number

Quindi quello che sto cercando di realizzare è avere un menu a discesa e se ovunque 1980-1900 è stato scelto il VIN sarà o seguire le linee guida dei manufatti o semplicemente si applica a tutti in cui le lettere I (I) , O (o) o Q (q) potrebbero essere utilizzati e qualsiasi numero di caratteri/numeri. Ma poi se 1981 e dopo viene scelto il RegEx per dare il via e chiedere che sia formattato con l'espressione che ho mostrato un VIN valido o invalido.

inserito un VIN valido per il momento a scopo di test .. se si elimina l'ultimo numero mostrerà "non valido Vin"

qualsiasi suggerimento o aiuto sarebbe molto apprezzato!

http://jsfiddle.net/ommLz4th/1/

RegExp

^[A-HJ-NPR-Z\\d]{8}[\\dX][A-HJ-NPR-Z\\d]{2}\\d{6}$ 

jQuery Validator 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

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
<label name="vin">VIN</label> 
<input type="text" id="vin" value="1FAFP40634F172825" /> 
<span id="result"></span> 

Drop Down per scopi di test

<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> 

Actual goccia giù

<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> 
+0

Avrete un diavolo di tempo per convalidare la cifra di controllo su 1981- VIN tramite regex. Consiglio vivamente [Wikipedia] (http://en.wikipedia.org/wiki/Vehicle_identification_number) come riferimento su questo argomento. –

+0

Intendi veramente "1980 - 1900"? –

+0

Fondamentalmente 1980 - (la prima auto mai realizzata) hahaha ... Non posso perdermi un anno, Sì, so che la Model T ha fatto il suo debutto nel 1908 :) –

risposta

2

io non è gonna sviluppare le espressioni regolari per voi, ma il modello globale dovrebbe essere qualcosa di simile:

$(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; 
     } 
    } 
}); 

noti che vine date vengono passati a validateVin() consentendo così al ramo di passare.

+0

Non ho provato a penetrare le regole di validazione ma sì, probabilmente quello che dici; il tuo RegExp (se corretto) si applicherà a uno dei rami e qualche altro RegExp (o qualsiasi altra cosa) si applicherà all'altro. –

+0

Beh, sì, ma non si stanno convalidando i vines post-1980. Sicuramente vuoi convalidare sia pre- che post-? –

+0

Che dire della regola "no Is or Os", non si applica a pre- e post-1980? –

Problemi correlati