Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   SyntaxError: invalid range in character class (https://javascript.ru/forum/misc/42089-syntaxerror-invalid-range-character-class.html)

Vampir3 11.10.2013 22:02

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');
})();

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

BETEPAH 11.10.2013 23:12

var reg = new RegExp('[', 'gi');

Vampir3 11.10.2013 23:18

Цитата:

Сообщение от BETEPAH (Сообщение 276026)
var reg = new RegExp('[', 'gi');

понял, а как пофиксить?

devote 11.10.2013 23:53

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('Пшму фт учфьзду ща сщву ерфе нщг вщ тще цщкл щк шы тще фы ше ырщгдвю'));
})();

BETEPAH 12.10.2013 00:31

У меня получилось так (наборы символов оставил из топика, можно расширять, добавить 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');

Vampir3 12.10.2013 00:54

ух ты
спасибо всем)

рони 14.10.2013 12:03

:) :write: вариант без 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('Пшму фт учфьзду ща сщву ерфе нщг вщ тще цщкл щк шы тще фы ше ырщгдвю'));
})();

devote 14.10.2013 12:54

Цитата:

Сообщение от рони
вариант без indexOf

indexOf быстрее работает чем for, это так на вскидку.


Часовой пояс GMT +3, время: 08:31.