Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.10.2013, 22:02
Профессор
Отправить личное сообщение для Vampir3 Посмотреть профиль Найти все сообщения от Vampir3
 
Регистрация: 06.12.2011
Сообщений: 172

SyntaxError: invalid range in character class
function toggleEncoding(txt) {
     var eng = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
     var rus = "f,dult`;pbqrkvyjghcnea[wxio]sm'.z";
     if(txt.search(/[а-яА-Я]/i) > -1) {
          for(i=0;i<eng.length;i++) {
               reg = new RegExp(eng[i], 'gi');
               txt = txt.replace(reg, rus[i]);
          }
     }
     else {
          for(i=0;i<eng.length;i++) {
               reg = new RegExp(rus[i], 'gi');
               txt = txt.replace(reg, eng[i]);
          }
     }
     alert(txt);
}

(function() {
     toggleEncoding('тест');
     toggleEncoding('ntcn');
})();

что ему не нравится?
с русским работает, а с англ - нет..

Последний раз редактировалось Vampir3, 11.10.2013 в 22:05.
Ответить с цитированием
  #2 (permalink)  
Старый 11.10.2013, 23:12
Аватар для BETEPAH
Профессор
Отправить личное сообщение для BETEPAH Посмотреть профиль Найти все сообщения от BETEPAH
 
Регистрация: 23.06.2011
Сообщений: 1,165

var reg = new RegExp('[', 'gi');
Ответить с цитированием
  #3 (permalink)  
Старый 11.10.2013, 23:18
Профессор
Отправить личное сообщение для Vampir3 Посмотреть профиль Найти все сообщения от Vampir3
 
Регистрация: 06.12.2011
Сообщений: 172

Сообщение от BETEPAH Посмотреть сообщение
var reg = new RegExp('[', 'gi');
понял, а как пофиксить?
Ответить с цитированием
  #4 (permalink)  
Старый 11.10.2013, 23:53
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

function toggleEncoding(txt) {
    var letters = "?,/.аfб,вdгuдlеtё`ж;зpиbйqкrлkмvнyоjпgрhсcтnуeфaх[цwчxшiщoъ]ыsьmэ'ю.яz" +
                 "АFБ<ВDГUДLЕTЁ~Ж:ЗPИBЙQКRЛKМVНYОJПGРHСCТNУEФAХ{ЦWЧXШIЩOЪ}ЫSЬMЭ\"Ю>ЯZ";
    return txt.replace(new RegExp('[' + letters.replace(/([\[\]\?])/g, '\\$1') + ']', 'gi'), function(letter) {
        var index = letters.indexOf(letter);
        if (index >= 0) {
            return letters[index & 1 ? index - 1 : index + 1];
        }
        return letter;
    });
}

(function() {
    alert(toggleEncoding('тест'));
    alert(toggleEncoding('ntcn'));
    alert(toggleEncoding('Ctujlyz vyt vfvf ghbujnjdbkf gbhj;rb? b jyb jxtym drecyst! Z b[ dct c]tk!)'));
    alert(toggleEncoding('Пшму фт учфьзду ща сщву ерфе нщг вщ тще цщкл щк шы тще фы ше ырщгдвю'));
})();
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #5 (permalink)  
Старый 12.10.2013, 00:31
Аватар для BETEPAH
Профессор
Отправить личное сообщение для BETEPAH Посмотреть профиль Найти все сообщения от BETEPAH
 
Регистрация: 23.06.2011
Сообщений: 1,165

У меня получилось так (наборы символов оставил из топика, можно расширять, добавить uppercase и др.):
function toggleEncoding(txt) {
	var rus = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
	var eng = "f,dult`;pbqrkvyjghcnea[wxio]sm'.z";
	if(txt.search(/[а-яА-Я]/i) > -1) var from = rus, to = eng;
	else var from = eng, to = rus;
	txt = txt.split('');
	for (var i = 0; i < txt.length; i++) {
		console.log(from.indexOf(txt[i]));
		txt[i] = to.charAt(from.indexOf(txt[i])) || txt[i];
	}
	txt = txt.join('');
	alert(txt);
}
toggleEncoding('тест');
toggleEncoding('ntcn');
Ответить с цитированием
  #6 (permalink)  
Старый 12.10.2013, 00:54
Профессор
Отправить личное сообщение для Vampir3 Посмотреть профиль Найти все сообщения от Vampir3
 
Регистрация: 06.12.2011
Сообщений: 172

ух ты
спасибо всем)
Ответить с цитированием
  #7 (permalink)  
Старый 14.10.2013, 12:03
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,124

вариант без indexOf и RegExp ...
function toggleEncoding(b) {
    var c, e = {}, a = 0;
    for (c = "?,/.аfб,вdгuдlеtё`ж;зpиbйqкrлkмvнyоjпgрhсcтnуeфaх[цwчxшiщoъ]ыsьmэ'ю.яzАFБ<ВDГUДLЕTЁ~Ж:ЗPИBЙQКRЛKМVНYОJПGРHСCТNУEФAХ{ЦWЧXШIЩOЪ}ЫSЬMЭ\"Ю>ЯZ".split(""); a < c.length; a++) {
        var d = c[a],
        f = c[++a];
        e[d] = f;
        e[f] = d
    }
    a = 0;
    b = b.split("");
    for (c = b.length; a < c; a++)(d = e[b[a]]) && (b[a] = d);
    return b.join("")
};

(function() {
    alert(toggleEncoding('тест'));
    alert(toggleEncoding('ntcn'));
    alert(toggleEncoding('Ctujlyz vyt vfvf ghbujnjdbkf gbhj;rb? b jyb jxtym drecyst! Z b[ dct c]tk!)'));
    alert(toggleEncoding('Пшму фт учфьзду ща сщву ерфе нщг вщ тще цщкл щк шы тще фы ше ырщгдвю'));
})();
Ответить с цитированием
  #8 (permalink)  
Старый 14.10.2013, 12:54
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от рони
вариант без indexOf
indexOf быстрее работает чем for, это так на вскидку.
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
jQuery UI Range slider как заблокировать левый ползунок по первому клику Oleg_Pupkin jQuery 3 04.09.2013 13:44
Использование классов в JavaScript devote Ваши сайты и скрипты 70 01.02.2013 17:17
Как работает функция Class godofjavascript Оффтопик 58 17.12.2012 09:49
firebug пишет ошибка invalid range in character class Dim@ Общие вопросы Javascript 5 10.05.2012 16:52
firebug пишет ошибка invalid range in character class Dim@ Общие вопросы Javascript 0 07.05.2012 21:03