Вы можете сделать это:
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()
.