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

Тема в разделе "JavaScript", создана пользователем kkkoopp, 11 фев 2013.

Модераторы: ZiX
  1. kkkoopp

    kkkoopp Постоялец

    Регистр.:
    18 май 2010
    Сообщения:
    121
    Симпатии:
    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);
            };
        })();
    Но некоторые символы не хотят заменяться, вернее при их указании в функции она вообще не работает, эти символы: знак вопроса (?) и восклицательный знак (!).
    Скорее всего это спецсимволы, я пробовал их экранировать слешем, но результат не дало.
     
  2. ВладимирТрой

    ВладимирТрой Постоялец

    Регистр.:
    29 янв 2013
    Сообщения:
    53
    Симпатии:
    19
    так а зачем тогда перечислять все символы если используется регулярка? не проще ли тогда для всех остальных символов для которых идет замена на '_' указать вот так '^a-я' : '_' (с перечислением всех использующихся символов таких как є, ї и т.д.) ?
     
  3. kkkoopp

    kkkoopp Постоялец

    Регистр.:
    18 май 2010
    Сообщения:
    121
    Симпатии:
    24
    Сделал я вот так, вроде работает правильно:

    Код:
        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);
            };
        })();
    Сперва буквы заменяю, а потом через регулярку всё остальное на знак подчеркивания.