Вы можете сделать это:
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;
}
Здесь match
и регулярное выражение /[^\w ]/g
используется, чтобы получить все символы, которые не являются ни слова, ни символы пробела. Массив совпадающих недопустимых символов затем очищается от дубликатов с использованием настраиваемого метода unique
(см. Ниже). Затем последний недопустимый символ удаляется из массива, чтобы добавить его, если необходимо, с помощью «и» в конце вывода. Остальные недопустимые символы (если они есть) затем соединяются с запятыми и объединены с последним недопустимым символом.
Поскольку JavaScript имеет встроенный в unique
методе для удаления дубликатов, вы можете использовать этот метод:
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;
};
Обратите внимание, что эта реализация не Типобезопасная как значения используются в качестве имен свойств и, таким образом, оказались в строки. Таким образом, ["3",3].unique()
возвращает ["3"]
, следовательно "3".toString() === (3).toString()
.
Это действительно требование? Не было бы более разумным иметь такое сообщение, как «разрешены только буквы, цифры, подчеркивание и дефис»? – karim79