2009-06-16 11 views
2

J'ai une chaîne et je veux valider cette chaîne afin qu'elle ne contienne pas certains caractères comme '/' '\' '&' ';' etc ... Comment puis-je faire tout cela en même temps?Validation de chaîne Javascript

+2

Plutôt que de vérifier la présence d'une liste noire de caractères interdits, il est préférable de vérifier la chaîne par rapport à une liste blanche de caractères autorisés, par ex. autorisant uniquement les caractères alphanumériques. –

Répondre

13

Vous pouvez résoudre ceci avec des expressions régulières!

mystring = "hello" 
yourstring = "bad & string" 

validRegEx = /^[^\\\/&]*$/ 

alert(mystring.match(validRegEx)) 
alert(yourstring.match(validRegEx)) 

correspondant contre la regex renvoie la chaîne si elle est ok, ou nul si l'invalide!

Explication:

  • JavaScript RegEx littéraux sont délimités comme des chaînes, mais avec des barres obliques (/ 's) au lieu des citations ("' s).
  • Le premier et le dernier caractère du validRegEx le font correspondre à l'ensemble de la chaîne, au lieu d'une partie, le carat l'ancre au début et le signe du dollar à la fin.
  • La partie entre les crochets ([ et ]) est une classe de caractères qui correspond à n'importe quel caractère tant qu'il fait partie de la classe. Le premier caractère à l'intérieur de cela, un carat, signifie que la classe est annulée, pour correspondre aux caractères non mentionnés dans la classe de caractères. Si elle avait été omise, la classe correspondrait aux caractères qu'elle spécifie.
    • Les deux séquences, \\ et \/ sont backslash parce que la barre oblique inverse par lui-même serait une séquence d'échappement pour autre chose, et la barre oblique pourrait confondre l'analyseur en pensant qu'il avait atteint la fin de la regex, (exactement similaire à l'échappement des guillemets dans les chaînes).
    • L'esperluette (&) n'a pas de signification particulière et n'est pas échappée.
  • Le caractère restant, l'kleene étoiles, (*) signifie que tout précédé devrait correspondre à zéro ou plusieurs fois, de sorte que la classe de caractères va manger autant de caractères qui ne sont pas en avant ou des barres obliques inversées ou esperluettes, y compris aucune si elle n'en trouve pas. Si vous voulez vous assurer que la chaîne correspondante n'est pas vide, vous pouvez la remplacer par un plus (+).
+0

Ummm ... sauf JavaScript regex n'a pas de fonction 'match', seulement' test'. –

+0

@LawrenceDol: '.match()' est utilisé sur un 'String', pas sur' RegExp'. Qu'est-ce qui se passe quand vous l'avez essayé? – SingleNegationElimination

+0

@Singe: OK, j'ai raté cette subtilité. Je suis venu ici à la recherche d'une solution dans une perspective regex. Merci. –

5

J'utiliserais des expressions régulières.

Voir this guide de Mozillla.org. Ce article donne également une bonne introduction aux expressions régulières en JavaScript.

3

Here est un bon article sur la validation Javascript. Rappelez-vous que vous devrez également valider sur le serveur. La validation de Javascript peut facilement être contournée, ainsi elle ne devrait jamais être employée pour des raisons de sécurité telles qu'empêcher l'injection de SQL ou les attaques de XSS.

1

Vous pouvez utiliser la méthode d'essai, avec des expressions régulières:

function validString(input){ 
    return !(/[\\/&;]/.test(input)); 
} 

validString('test;') //false 
1

Vous pourrait apprendre des expressions régulières, ou (probablement plus simple si vous vérifiez que pour un seul caractère à la fois), vous pourriez avoir une liste de caractères, puis une sorte de sanitize fonction pour supprimer chacun de la chaîne.

var myString = "An /invalid &string;"; 
var charList = ['/', '\\', '&', ';']; // etc... 

function sanitize(input, list) { 
    for (char in list) { 
     input = input.replace(char, ''); 
    } 
    return input 
} 

Alors:

sanitize(myString, charList) // returns "An invalid string" 
0

Comme les autres ont répondu que vous pouvez résoudre cela avec regexp mais rappelez-vous de vérifier également le côté serveur de valeur. Il n'y a aucune garantie que l'utilisateur a JavaScript activé. Ne faites jamais confiance aux commentaires des utilisateurs!

Questions connexes