2016-11-08 4 views
1

Ich habe eine persönliche Funktion, die eine ID und ein Muster für die Überprüfung einige Eingaben nehmen.Sende Muster an eine Funktion

var id, schema; 
 
\t function checkField(id, schema){ 
 
\t \t var input = id.val(); 
 
\t \t var pattern = schema; 
 

 
\t \t if (!input.match(pattern)){ 
 
\t \t \t console.log('Input = '+input); 
 
\t \t \t console.log('Pattern = '+pattern); 
 
\t \t \t id.removeClass().addClass("error"); 
 
\t \t \t $(".oke").css({display: 'none'}); 
 
\t \t }else{ 
 
\t \t \t console.log('Classe = ok'); 
 
\t \t \t id.removeClass().addClass("ok"); 
 
\t \t \t $(".nope").css({display: 'none'}); 
 
\t \t } 
 
\t } 
 

 
\t // Vérification téléphone 
 
\t $("#tel").focusout(function(){ 
 
\t \t checkField($(this), "/0[1-7,9]\d{8}/"); 
 
\t }); 
 

 
\t // Vérification code postale 
 
\t $("#cp").focusout(function(){ 
 
\t \t checkField($(this), "/^((0[1-9])|([1-8][0-9])|(9[0-8])|(2A)|(2B))[0-9]{3}$/"); 
 
\t });

Aber die, wenn Zustand zurück immer null (!input.match(pattern)). Die beiden Konsolen-Log geben die Zahl in Eingabe und das Muster korrekt zurück, warum das if immer falsch ist?

+2

Die doppelten Anführungszeichen aus dem ganzen regexps und die erste Anker könnte auch müssen entfernt werden muß ('/^0 [1-79] \ d {8} $/'). Und der zweite kann geschrieben werden als '/^(0 [1-9] | [1-8] \ d | 9 [0-8] | 2 [AB]) \ d {3} $ /'. Es ist auch ratsam, 'if (! Input.match (pattern))' durch 'if (! Pattern.test (input)) ' –

+0

Excellent, thanks zu ersetzen. Was ist der Unterschied zwischen input.match pattern und pattern.test Eingabe? – Buck

+0

'test()' returns * true * oder * false *, während 'match' entweder * null * oder ein Array von Match-Daten zurückgibt. –

Antwort

2

Wenn Sie "/0[1-7,9]\d{8}/" zum String#match() passieren, die einzelnen \ vor d entfernt, da es eine unbekannte Escape-Sequenz ist und die / um das Muster als wörtliche / Symbole in dem Muster behandelt. So bekommst du keine Übereinstimmungen. Auch die , in der Zeichenklasse wird auch als ein Literal Komma betrachtet, ich bin sicher, dass Sie es aus dem Muster entfernen möchten. Außerdem fehlt das erste Muster ^ am Anfang und $ Anker am Ende, wenn Sie planen, die gesamte Zeichenfolge übereinzustimmen. Übergeben Sie entweder "^0[1-79]\\d{8}$" oder - bevorzugt - verwenden Sie ein Regex-Literal /^0[1-7,9]\d{8}$/ (keine doppelten Anführungszeichen um das Muster).

Das zweite Muster kann verkürzt werden als /^(0[1-9]|[1-8]\d|9[0-8]|2[AB])\d{3}$/ - wieder, beachten Sie die Abwesenheit der Anführungszeichen um die regex literale Notation.

Auch ist es ratsam, if (!input.match(pattern)) mit if (!pattern.test(input)) als regex.test(str) kehrt wahr oder falsch während str.match(regex) entweder null oder eine Reihe von Spieldaten zurück zu ersetzen.

Also, was können Sie verwenden, ist

if (!pattern.test(input)){ 
... 

$("#tel").focusout(function(){ 
    checkField($(this), /^0[1-79]\d{8}$/); 
}); 

$("#cp").focusout(function(){ 
    checkField($(this), /^(0[1-9]|[1-8]\d|9[0-8]|2[AB])\d{3}$/); 
}) 
1

JavaScript regex Muster sind nicht Zeichenfolgen, sollten Sie die Anführungszeichen entfernen.

$("#tel").focusout(function(){ 
    checkField($(this), /0[1-7,9]\d{8}/); 
}); 

$("#cp").focusout(function(){ 
    checkField($(this), /^((0[1-9])|([1-8][0-9])|(9[0-8])|(2A)|(2B))[0-9]{3}$/); 
}) 
Verwandte Themen