Некорректно работает функция

kkkoopp

Постоялец
Регистрация
18 Май 2010
Сообщения
120
Реакции
24
Есть функция транслитерации, я в нее указал какие на какие символы нужно заменять:

HTML:
    function inp_translit (){
        var _inner_text = document.getElementById("result_name_hidden").value;
        document.getElementById("code_name").value = _inner_text.toLowerCase().translit();
    }
    String.prototype.translit = (function(){
        var L = {
    'а':'a', 'б':'b', 'в':'v', 'г':'g', 'д':'d', 'е':'e', 'ё':'yo', 'ж':'zh', 'з':'z',
    'и':'i', 'й':'y', 'к':'k', 'л':'l', 'м':'m', 'н':'n', 'о':'o', 'п':'p', 'р':'r',
    'с':'s', 'т':'t', 'у':'u', 'ф':'f', 'х':'h', 'ц':'c', 'ч':'ch', 'ш':'sh', 'щ':'shch',
    'ъ':'', 'ы':'y', 'ь':'', 'э':'e', 'ю':'yu', 'я':'ya', ' ':'_', 'і':'i', 'ў':'u',
    'є':'e', 'ї':'i', ',':'_', '.':'_', '(':'_', ')':'_', ':':'_', '«':'_', '—':'_', '»':'_',
    '-':'_'
            },
            r = '',
            k;
        for (k in L) r += k;
        r = new RegExp('[' + r + ']', 'g');
        k = function(a){
            return a in L ? L[a] : '';
        };
        return function(){
            return this.replace(r, k);
        };
    })();

Но некоторые символы не хотят заменяться, вернее при их указании в функции она вообще не работает, эти символы: знак вопроса (?) и восклицательный знак (!).
Скорее всего это спецсимволы, я пробовал их экранировать слешем, но результат не дало.
 
так а зачем тогда перечислять все символы если используется регулярка? не проще ли тогда для всех остальных символов для которых идет замена на '_' указать вот так '^a-я' : '_' (с перечислением всех использующихся символов таких как є, ї и т.д.) ?
 
Сделал я вот так, вроде работает правильно:

Код:
    function inp_translit (){
        var _inner_text = document.getElementById("result_name_hidden").value;
        _inner_text = _inner_text.toLowerCase().translit();
        document.getElementById("code_name").value = _inner_text.replace(/[^\w]/g, '_');
    }
    String.prototype.translit = (function(){
        var L = {
    'а':'a', 'б':'b', 'в':'v', 'г':'g', 'д':'d', 'е':'e', 'ё':'yo', 'ж':'zh', 'з':'z',
    'и':'i', 'й':'y', 'к':'k', 'л':'l', 'м':'m', 'н':'n', 'о':'o', 'п':'p', 'р':'r',
    'с':'s', 'т':'t', 'у':'u', 'ф':'f', 'х':'h', 'ц':'c', 'ч':'ch', 'ш':'sh', 'щ':'shch',
    'ъ':'', 'ы':'y', 'ь':'', 'э':'e', 'ю':'yu', 'я':'ya', 'і':'i', 'ў':'u', 'є':'e', 'ї':'i'
            },
            r = '',
            k;
        for (k in L) r += k;
        r = new RegExp('[' + r + ']', 'g');
        k = function(a){
            return a in L ? L[a] : '';
        };
        return function(){
            return this.replace(r, k);
        };
    })();

Сперва буквы заменяю, а потом через регулярку всё остальное на знак подчеркивания.
 
Назад
Сверху