Vous pouvez le faire:
var invalidChars = str.match(/[^\w ]/g), output = '';
if (invalidChars) {
invalidChars = invalidChars.unique();
var lastInvalidChar = invalidChars.pop();
output = 'You have used the illegal character' + (invalidChars.length > 0 ? 's' : '') + ' ' +
invalidChars.join(', ') + (invalidChars.length > 0 ? ' and ' : '') + lastInvalidChar;
}
Ici match
et l'expression régulière /[^\w ]/g
est utilisée pour obtenir tous les caractères qui ne sont ni des caractères de texte, ni un espace. Le tableau de caractères invalides est ensuite nettoyé des doublons en utilisant la méthode personnalisée unique
(voir ci-dessous). Ensuite, le dernier caractère invalide est retiré du tableau pour l'ajouter si nécessaire avec un "et" à la fin de la sortie. Les caractères invalides restants (s'il y en a) sont ensuite joints avec des virgules et combinés avec le dernier caractère invalide.
Depuis JavaScript n'a pas unique
méthode intégrée pour supprimer les doublons, vous pouvez utiliser cette méthode:
Array.prototype.unique = function() {
var index = {};
for (var i=0; i<this.length; ++i) {
if (!index.hasOwnProperty(this[i])) {
index[this[i]] = this[i];
}
}
var clean = [];
for (var prop in index) {
if (index.hasOwnProperty(prop)) {
clean.push(index[prop]);
}
}
return clean;
};
Notez que cette mise en œuvre est le type-safe que les valeurs sont utilisées comme noms de propriétés et ont donc eu recours en chaînes. Donc ["3",3].unique()
renvoie ["3"]
d'où "3".toString() === (3).toString()
.
Est-ce vraiment l'exigence? Ne serait-il pas plus judicieux d'avoir un message tel que «seules les lettres, les chiffres, le trait de soulignement et le trait d'union sont autorisés»? – karim79