Сделать транслит

Discussion in 'PHP' started by Myload, 23 Mar 2009.

  1. Myload

    Myload Banned

    Joined:
    15 Mar 2009
    Messages:
    0
    Likes Received:
    96
    Reputations:
    6
    нашел скрипт транслит но незнаю
    как сделать чтоб переводил помогите спс :rolleyes:

    PHP:
    <script type="text/javascript">  
      var 
    latin=("a-b-c-d-e-f-g-h-i-j-k-l-m-n-o-p-q-r-s-t-u-v-w-x-y-z-;-A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z").split("-")  
      var 
    ciril=("а-б-ц-д-е-ф-г-х-и-й-к-л-м-н-о-п-э-р-с-т-у-в-ш-ы-ч-з-я-А-Б-Ц-Д-Е-Ф-Г-Х-И-Й-К-Л-М-Н-О-П-Э-Р-С-Т-У-В-Ш-Ы-Ч-З").split("-")  
      
    //(c) subONE [razgona.net]  
      
    function translit() {  
      var 
    omg=document.selection.createRange()  
      var 
    omg1=omg.text  
      
    var xy=0  
      
    for(xy=0xy<=(latin.length-1); xy++) {  
      var 
    latin1="/"+latin[xy]+"/g"  
      
    omg1=omg1.replace(eval(latin1), ciril[xy])  
      }  
      
    omg.text=omg1  
      
    }  
      
    </script> 

    <textarea name="Message" id="Message" cols="30" rows="5" class="text"></textarea><br>

    <input type="button" value="Транслит" onclick="translit()">
     
  2. Myload

    Myload Banned

    Joined:
    15 Mar 2009
    Messages:
    0
    Likes Received:
    96
    Reputations:
    6
    да и как сделать из вот это

    <a href="javascript:t.go(0)" title="Перевести в кириллицу">Кириллица</a>

    кнопку?
     
  3. inlanger

    inlanger Elder - Старейшина

    Joined:
    7 Jan 2007
    Messages:
    985
    Likes Received:
    283
    Reputations:
    27
    <input type=button onclick=t.go(0) value="Йа кнопка">
     
  4. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    Code:
    <script>
    var rusChars = new Array('а','б','в','г','д','е','ё','ж','з','и','й','к','л','м','н','о','п','р','с','т','у','ф','х','ч','ц','ш','щ','э','ю','\я','ы','ъ','ь', ' ', '\'', '\"', '\#', '\$', '\%', '\&', '\*', '\,', '\:', '\;', '\<', '\>', '\?', '\[', '\]', '\^', '\{', '\}', '\|', '\!', '\@', '\(', '\)', '\-', '\=', '\+', '\/', '\\');
    var transChars = new Array('a','b','v','g','d','e','jo','zh','z','i','j','k','l','m','n','o','p','r','s','t','u','f','h','ch','c','sh','csh','e','ju','ja','y','', '', ' ', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '');
    var from = "";
    
    function convert2EN()
      {
      from = document.getElementById("Message").value;
      from = from.toLowerCase();
      var to = "";
      var len = from.length;
      var character, isRus;
      for(var i=0; i < len; i++)
        {
        character = from.charAt(i,1);
        isRus = false;
        for(var j=0; j < rusChars.length; j++)
          {
          if(character == rusChars[j])
            {
            isRus = true;
            break;
            }
          }
        to += (isRus) ? transChars[j] : character;
        }
       document.form1.Message.value = to; 
      }
    </script>
    
    <FORM NAME="form1">
    <textarea name="Message" id="Message" cols="30" rows="5" class="text"></textarea><br> 
    <input type="button" value="Транслит" onclick="convert2EN()">
    </FORM>
    
     
    1 person likes this.
  5. Myload

    Myload Banned

    Joined:
    15 Mar 2009
    Messages:
    0
    Likes Received:
    96
    Reputations:
    6
    спс;)
     
  6. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    использовал конвертер в транслит, немного улучшил:
    в частности там нет необходимости перебирать весь массив с русскими символами, чтобы узнать русский у нас символ или нет. достаточно использовать indexOf
     
    #6 Дикс, 27 Mar 2009
    Last edited: 27 Mar 2009
  7. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    Конвертер транслита на яваскрипт

    ваще вот лучший пример:

    PHP:

    <script type='text/javascript'>

    function 
    translit(id) {

        var 
    field document.getElementById(id);
        var 
    from field.value.toLowerCase();

        var 
    rusChars = new Array('а','б','в','г','д','е','ё','ж','з','и','й',  'к','л','м','н','о','п','р','с','т','у','ф','х','ч  ','ц','ш','щ','э','ю','\я','ы','ъ','ь'' ''\'''\"''\#''\$''\%''\&''\*''\,''\:''\;''\<''\>''\?''\[''\]''\^''\{''\}''\|''\!''\@''\(''\)''\-''\=''\+''\/''\\');
        var 
    transChars = new Array('a','b','v','g','d','e','jo','zh','z','i','j  ','k','l','m','n','o','p','r','s','t','u','f','h',  'ch','c','sh','csh','e','ju','ja','y','_''_''_''_''_''_''_''_''_''''''''''''''''''''''''''''''''''''_''_''_''_''_');

        var 
    to '';
        var 
    len from.length;
        var 
    rlen rusChars.length;
        var 
    characterisRus;

        for(var 
    0leni++)
        {
            var 
    character from.charAt(i,1);
            var 
    foundIndex rusChars.indexOf(character);
            
    to += (foundIndex != -1) ? transChars[foundIndex] : character;
        }

        
    field.value to;
    }

    </script>
    <input type='text' id='message' /><input type='button' onclick='translit("message")' value='&larr; to translite' />


    Файл должен быть в ansi (windows-1251) кодировке.
     
    1 person likes this.
  8. astrologer

    astrologer Elder - Старейшина

    Joined:
    30 Aug 2007
    Messages:
    837
    Likes Received:
    267
    Reputations:
    59
    1. charAt принимает один параметр
    2. Метод Array.prototype.indexOf не является стандартным и его нет как минимум в ie
    3. hint:
      Code:
      {
        'а': 'a',
        'б': 'b',
        'в': 'v'
        /* etc */
      }
     
  9. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    спасибо
     
  10. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    чет я не понимаю..
    charsArray - это объект.
    как получить его длину?
    и как проверить наличие в нём текущей буквы? (в смысле есть ли способ, типа indexOf)?

    PHP:
    function translit() {

        var 
    charsArray = {
            
    'а':'a',
            
    'б':'b',
            
    'в':'v',
            
    'г':'g',
            
    'д':'d',
            
    'е':'e',
            
    'ё':'jo',
            
    'ж':'zh',
            
    'з':'z',
            
    'и':'i',
            
    'й':'j',
            
    'к':'k',
            
    'л':'l',
            
    'м':'m',
            
    'н':'n',
            
    'о':'o',
            
    'п':'p',
            
    'р':'r',
            
    'с':'s',
            
    'т':'t',
            
    'у':'u',
            
    'ф':'f',
            
    'х':'h',
            
    'ч':'ch',
            
    'ц':'c',
            
    'ш':'sh',
            
    'щ':'csh',
            
    'э':'e',
            
    'ю':'ju',
            
    '\я':'ja',
            
    'ы':'y',
            
    'ъ':'',
            
    'ь':'\'',
            
    ' ':'_',
            
    '\'':'',
            
    '\"':'',
            
    '\#':'',
            
    '\$':'',
            
    '\%':'',
            
    '\&':'',
            
    '\*':'',
            
    '\,':'',
            
    '\:':'',
            
    '\;':'',
            
    '\<':'',
            
    '\>':'',
            
    '\?':'',
            
    '\[':'',
            
    '\]':'',
            
    '\^':'',
            
    '\{':'',
            
    '\}':'',
            
    '\|':'',
            
    '\!':'',
            
    '\@':'',
            
    '\(':'',
            
    '\)':'',
            
    '\-':'_',
            
    '\=':'',
            
    '\+':'',
            
    '\/':'',
            
    '\\':''
        
    };
        var 
    field document.getElementById('message');
        var 
    from field.value.toLowerCase();

        var 
    to '';
        var 
    character;

        for(var 
    061i++)
        {
            var 
    character from.charAt(i);
            
    foundIndex charsArray.indexOf(character);
            
    to += (foundIndex != -1)? charsArray[character] : character;
        }

        
    field.value to;
    }
     
  11. astrologer

    astrologer Elder - Старейшина

    Joined:
    30 Aug 2007
    Messages:
    837
    Likes Received:
    267
    Reputations:
    59
    Его длина тут не нужна.
    Code:
    (character in charsArray)
    Code:
    (charsArray[character])
     
  12. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    var x = new Array();
    x[0] = "Строка";
    x[1] = "Еще строка";
    var l = x.length; // l равно 2

    по поводу поиска без перебора здесь:

    http://habrahabr.ru/blogs/javascript/46787/
     
  13. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    PHP:
    function translit(id) {

        var 
    charsArray = {
            
    'а':'a',
            
    'б':'b',
            
    'в':'v',
            
    'г':'g',
            
    'д':'d',
            
    'е':'e',
            
    'ё':'jo',
            
    'ж':'zh',
            
    'з':'z',
            
    'и':'i',
            
    'й':'j',
            
    'к':'k',
            
    'л':'l',
            
    'м':'m',
            
    'н':'n',
            
    'о':'o',
            
    'п':'p',
            
    'р':'r',
            
    'с':'s',
            
    'т':'t',
            
    'у':'u',
            
    'ф':'f',
            
    'х':'h',
            
    'ч':'ch',
            
    'ц':'c',
            
    'ш':'sh',
            
    'щ':'csh',
            
    'э':'e',
            
    'ю':'ju',
            
    '\я':'ja',
            
    'ы':'y',
            
    'ъ':'',
            
    'ь':'\'',
            
    ' ':'_',
            
    '\'':'',
            
    '\"':'',
            
    '\#':'',
            
    '\$':'',
            
    '\%':'',
            
    '\&':'',
            
    '\*':'',
            
    '\,':'',
            
    '\:':'',
            
    '\;':'',
            
    '\<':'',
            
    '\>':'',
            
    '\?':'',
            
    '\[':'',
            
    '\]':'',
            
    '\^':'',
            
    '\{':'',
            
    '\}':'',
            
    '\|':'',
            
    '\!':'',
            
    '\@':'',
            
    '\(':'',
            
    '\)':'',
            
    '\-':'_',
            
    '\=':'',
            
    '\+':'',
            
    '\/':'',
            
    '\\':''
        
    };
        var 
    character;
        var 
    field document.getElementById(id);
        var 
    from field.value.toLowerCase();
        
    field.value '';

        for(var 
    061i++)
        {
            
    character from.charAt(i);
               
    field.value += (character in charsArray)? charsArray[character] : character;
        }
    }

    Вот. здесь можно чета улучшить ещё?
     
  14. astrologer

    astrologer Elder - Старейшина

    Joined:
    30 Aug 2007
    Messages:
    837
    Likes Received:
    267
    Reputations:
    59
    Конечно.


    Code:
    for(var i = 0; i < 61; i++)
    Обрабатываются только первые 62 знака исходного текста. Всё, что после - нет.


    Code:
    '\'': '',  '\"': '',  '\#': '',  '\$': '',
    '\%': '',  '\&': '',  '\*': '',  '\,': '',
    '\:': '',  '\;': '',  '\<': '',  '\>': '',
    '\?': '',  '\[': '',  '\]': '',  '\^': '',
    '\{': '',  '\}': '',  '\|': '',  '\!': '',
    '\@': '',  '\(': '',  '\)': '',  '\-': '_',
    '\=': '',  '\+': '',  '\/': '',  '\\': ''
    Экранирующий слэш нужен только в первом и последнем случаях. Зачем вообще удалять все эти символы - неясно.


    Code:
    var character;
    var field = document.getElementById(id);
    var from = field.value.toLowerCase();
    field.value = '';
    Лучше бы функции транслитерации только этим и заниматься, ей передали текст (и таблицу замен - опционально) - она вернула текст, не очищая там попутно левые поля, не заполняя их ничем, но это так, к слову.


    Code:
    character = from.charAt(i);
    Пусть :)


    Code:
    field.value += (character in charsArray) ? charsArray[character] : character;
    Можно было обойтись без этой проверки, немного развернув логику - проходить не по строке, а по самой таблице замен. (for..in)