Первое решение не работает для любого алфавита UTF-8. (Это будет вырезать текст, такой как Їжак). Мне удалось создать функцию, которая не использует RegExp и использует хорошую поддержку UTF-8 в движке JavaScript. Идея проста, если символ равен в верхнем и нижнем регистре, это специальный символ. Единственное исключение сделано для пробелов.
function removeSpecials(str) {
var lower = str.toLowerCase();
var upper = str.toUpperCase();
var res = "";
for(var i=0; i<lower.length; ++i) {
if(lower[i] != upper[i] || lower[i].trim() === '')
res += str[i];
}
return res;
}
Обновление: обратите внимание, что это решение работает только для языков, где есть маленькие и заглавные буквы. На таких языках, как китайский, это не сработает.
Обновление 2: я пришел к исходному решению, когда работал над нечетким поиском. Если вы также пытаетесь удалить специальные символы для реализации функции поиска, есть лучший подход. Используйте любую библиотеку транслитерации, которая выдаст вам строку только из латинских символов, а затем простой Regexp сделает всю магию удаления специальных символов. (Это будет работать и для китайцев, и вы также получите дополнительные преимущества, сделав Tromsø
== Tromso
).