1. JavaScript / Говнокод #2629

    +168.1

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    var rus = new String("йцукенгшщзфывапролдячсмитьЙЦУКЕНГШЩЗФЫВАПРОЛДЯЧСМИТЬ");
    var eng = new String("qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM");
    for (var i in rus) {
    	reg = new RegExp(rus[i], 'g');
    	pass = pass.replace(reg, eng[i]);
    }

    Конвертация русских чаров в английские в соответствии с расположением на клаве. Зачем - не суть важно. Регулярки! Десятки их! Полсотни итераций для простой замены русских букв на английские!

    Запостил: ixth, 17 Февраля 2010

    Комментарии (20) RSS

    • Зато солидно выглядит. (:
      Ответить
      • Я сделал так и не уверен, что это самый правильный способ:
        var rus = "йцукенгшщзфывапролдячсмитьЙЦУКЕНГШЩЗФЫВАПРОЛДЯЧСМИТЬ",
        	eng = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";
        
        pass = pass.replace(/[а-яА-Я]/g, function(c){
        	var i = rus.indexOf(c);
        	return eng[i];
        });

        Можно все упростить и заюзать хэш, конечно. Я сильно неправ?
        Ответить
        • Мм.. правильнее я вижу только такое:

          var table = {"й":"q","ц":"w","у":"e","к":"r","е":"t","н":"y","г":"u","ш":"i","щ":"o","з":"p","ф":"a","ы":"s","в":"d","а":"f","п":"g","р":"h","о":"j","л":"k","д":"l","я":"z","ч":"x","с":"c","м":"v","и":"b","т":"n","ь":"m","Й":"Q","Ц":"W","У":"E","К":"R","Е":"T","Н":"Y","Г":"U","Ш":"I","Щ":"O","З":"P","Ф":"A","Ы":"S","В":"D","А":"F","П":"G","Р":"H","О":"J","Л":"K","Д":"L","Я":"Z","Ч":"X","С":"C","М":"V","И":"B","Т":"N","Ь":"M"};
          
          var myvar = 'Йцукен'.replace(/[а-я]/gi, function(i){ return table[i]; });


          Этот способ достаточно быстр (при замене символа никакие методы не вызываются), хоть и памяти будет расходовать немного больше из-за хэша. (Но кого сейчас это волнует?)
          Ответить
          • Мне было лень делать из двух строк хэш. )
            Ответить
            • Мне тоже ;)
              Но мы же знаем javascript..

              for(var i = 0, array = []; i < 58; i++) array.push('"' + rus[i] + '":"' + eng[i] + '"');
              document.write('{' + array.join(',') + '};');
              Ответить
              • Еще eval'а тут нехватало

                r={}
                for(var i = 0, array = []; i < 58; i++) r[rus[i]]= eng[i];
                Ответить
          • var rus = "йцукенгшщзфывапролдячсмитьЙЦУКЕНГШЩЗФЫВАПРОЛДЯЧСМИТЬ".split(''),
            	eng = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM".split('');
            var cnt=rus.length;
            var table = {};
            for(var i=0;i<cnt;i++){
            	table[rus[i]]=eng[i];
            }
            var myvar = 'Йцукен'.replace(/[а-я]/gi, function(i){ return table[i]; });
            Ответить
    • Еще и работает, ЕМНИП, не везде. Поддержка обращения к i-ому символу строки как к элементу массива появилась недавно.
      Ответить
      • Ни разу не видел, чтобы кто-то юзал для этого charAt.
        Ответить
        • Значит мало кода видели. Обычно его и юзают.
          Ответить
    • БЮЁЖЭХЪ
      Ответить
      • На самом деле, предполагается, что этих символов попросту не будет в изначальной строке. Не может быть в пароле брэкетов, запятых и точек. Буковок Ё тоже.
        Ответить
        • Предполагает разработчик, а клава у юзера ))
          А самое интересное, что "ё" вашей регуляркой не ловится.
          'йцукенЁЖ' - > 'qwertyЁundefined' нормально?
          var rus = "йцукенгшщзфывапролдячсмитьЙЦУКЕНГШЩЗФЫВАПРОЛДЯЧСМИТЬБЮЁЖЭХЪбюёжэх",
          	eng = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";
          pass = "123testйцукенЁЖ'!".replace(/[^\w]/g, function(c){
          	var i = rus.indexOf(c);
          	return i >-1 ? (eng.charAt(i) || i.toString(32)) : 'x';
          });
          //123testqwerty1m1nxx
          Ответить
    • А в РНР нету аналога perl/bash'евого tr ?
      Ответить
    • Я такой велосипелдист, господа! Нашел вот такой вариант:
      http://obvcode.blogspot.com/2008/05/strtr-for-javascript.html
      Ответить
    • Плох тот язык где пол сотни итераций это много
      Ответить
      • язык или реализация интерпретатора?
        разные вещи какбэ
        Ответить

    Добавить комментарий