За последние 24 часа нас посетили 57339 программистов и 1810 роботов. Сейчас ищут 894 программиста ...

Транслит

Тема в разделе "PHP для новичков", создана пользователем Egorov, 23 авг 2008.

  1. Egorov

    Egorov Активный пользователь

    С нами с:
    23 авг 2008
    Сообщения:
    10
    Симпатии:
    0
    Нужно сделать функцию, которая бы переводила строку из кирилицы в латиницу и обратно в зависимости от переданных параметров

    Очень хочется сделать просто вот так:

    PHP:
    1.  
    2. <?php
    3. function translit($str, $do = 1) {
    4.     $str = strtolower($str);
    5.     $ru = array('а', 'б', 'в', 'г', 'д', 'е', 'ё',  'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ь', 'ы', 'ъ', 'э', 'ю' , 'я',  ' ');
    6.     $en = array(); //Соответственно эквиваленты, которые писать лень
    7.     if($do == 1) { $str = str_replace($ru, $en, $str); } //Если $do == 1 переводим с кирилицу на латиницу
    8.     else { $str = str_replace($en, $ru, $str); } //Иначе с латиницы на кирилицу
    9.     return $str;
    10. }
    11. ?>
    12.  
    Легко можно перевести строку с кирилицы на латиницу, но вот обратно возникают проблемы, так как некоторые символы, например, "ч", обозначаются сразу двумя буквами эквивалента - "ch", соответственно, функция переведет "ch" не как "ч", а как "цх".

    В голову напрашиваются только сложные алгоритмы, перебирающие строку посимвольно и проверяющие следующий и предыдущий символы. Но я почти уверен, что есть более простые решения. Помогите, можно на пальцах без кода :)
     
  2. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Egorov
    Перевести простым алгоритмом, а потом дополнительными str_replace заменить все "цх" и иже с ними на более читабельные символы :D
    Но скорее всего, результат все равно будет неидеальным, типа "Чинвалле"...
     
  3. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    А почему не iconv?
     
  4. Egorov

    Egorov Активный пользователь

    С нами с:
    23 авг 2008
    Сообщения:
    10
    Симпатии:
    0
    А чем может помочь iconv?

    На всякий случай, объясню для чего нужен такой транслит. Обрабатывается некий текст и генерируются много ссылок типа http://site?tag=privet, при переходе по ссылке значение $_GET['tag'] переводится в русское слово и на основе этого русского слова из текста выдирается только соответствующий этому слову текст. Как теги в блогах, если так будет легче понять.

    Я так понял идеального транслита сделать невозможно и заменил двойные символы цифрами (sh = 1, ch=2). Адрес типа http://site?tag=2islo смотрится некрасиво и непонятно, но все же лучше, чем русские символы в адресной строке FF :)
     
  5. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    Egorov
    для передачи русских слов обычно пользуются urlencode и urldecode, а не хитрые самописные системы.

    но из-за необходимости обратной перекодировки не подойдёт
     
  6. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Что мешает хранить в таблице транслитизированный вариант строки и делать выборку по нему?
     
  7. Egorov

    Egorov Активный пользователь

    С нами с:
    23 авг 2008
    Сообщения:
    10
    Симпатии:
    0
    Загроможденность получится :) Намного легче кажый раз делать транслит.

    Я уже смирился, пусть будут цифры вместо некоторых символов.

    Нужен именно транслит, пусть даже не совсем правильный.
     
  8. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Чего?
     
  9. Egorov

    Egorov Активный пользователь

    С нами с:
    23 авг 2008
    Сообщения:
    10
    Симпатии:
    0
    Вобщем никак :)

    Не совсем понял, что именно предложено - хранить сразу и русский и английский текст(загромаждение), или сразу английский (не получится).

    Просто база данных представляет собой файл, который нужно рассортировать по категориям, тегам и прочим. Это все делается только через глубокую жопу + нужно передавать эти теги и категории обработчику только английскими буквами и хотелось бы чтобы урл был хоть немного человекопонятный.
     
  10. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Считаешь транслит ЧП? Лично я - нет.
     
  11. Egorov

    Egorov Активный пользователь

    С нами с:
    23 авг 2008
    Сообщения:
    10
    Симпатии:
    0
    site.ru/?tag=avtomobili - сразу понятно что увидиш информацию, связянную с автомобилями
    site.ru/?tag=123ф24ф23 - ничерта не понятно.

    Вот что я имел в виду, говоря про ЧП

    А русские вызывают много проблем, - некоторые браузеры преобразуют кирилицу в крякозабру типа %35%34, да и ссылку сложно дать кому-то на форуме(например) если браузер корректно отображает кирилицу:

    http://site.ru/?tag=русское слово

    upd: Зачем каптча стоит после сообщения, если ее вводить необязательно :)
     
  12. GudGuy

    GudGuy Активный пользователь

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    я делаю так:
    PHP:
    1. $stroka = strtolower($stroka);
    2.         $stroka = trim($stroka);
    3.         $trans = array ('а'=>'a', 'б'=>'b', 'в'=>'v', 'г'=>'g', 'д'=>'d', 'е'=>'e', 'ё'=>'yo', 'ж'=>'zh', 'з'=>'z', 'и'=>'i', 'й'=>'j', 'к'=>'k', 'л'=>'l', 'м'=>'m', 'н'=>'n', 'о'=>'o', 'п'=>'p', 'р'=>'r', 'с'=>'s', 'т'=>'t', 'у'=>'u', 'ф'=>'f', 'х'=>'h', 'ц'=>'c', 'ч'=>'ch', 'ш'=>'sh', 'щ'=>'w', 'ы'=>'y', 'ю'=>'yu', 'я'=>'ya', 'ь'=>'', 'ъ'=>'', 'э'=>'a', ' '=>'', '('=>'_', ')'=>'_', '-'=>'');
    4.         $alt = strtr($stroka, $trans);