webew
Войти » Регистрация
 
PHP

Перевод в транслит русских и украинских текстов

19 марта 2010, 1:13

Очень простая, но полезная и эффективная функция для перевода русского и украинского текста в транслит.

function translit($str) {
    // Сначала заменяем "односимвольные" фонемы.
    $str=strtr($str, "абвгдеёзийклмнопрстуфхъьыэ", "abvgdeeziyklmnoprstufh''ie");
    $str=strtr($str, "АБВГДЕЁЗИЙКЛМНОПРСТУФХЪЬЫЭ", "ABVGDEEZIYKLMNOPRSTUFH''IE");

    // Затем - "многосимвольные".
    $str=strtr($str,
                    array(
                        "ж"=>"zh", "ц"=>"ts", "ч"=>"ch", "ш"=>"sh",
                        "щ"=>"sch", "ю"=>"yu", "я"=>"ya",
                        "Ж"=>"ZH", "Ц"=>"TS", "Ч"=>"CH", "Ш"=>"SH",
                        "Щ"=>"SCH","Ю"=>"YU", "Я"=>"YA",
                        "ї"=>"i", "Ї"=>"Yi", "є"=>"ie", "Є"=>"Ye"
                        )
             );
    return $str;
}

Автор оригинальной функции — Андрей Дрыга (код приводится с небольшими изменениями).
Первоисточник публикации — http://www.softtime.ru/scripts/translit.php.
Добавить комментарий
Отображение комментариев: Древовидное | Плоское
NO USERPIC

jarmush

Прекрасный код. Вот только не работает, если сайт на UTF 8

Вот более другое решение:

function translite($string) {
        $rus=array("ё","й","ю","ь","ч","щ","ц","у","к",
        "е","н","г","ш","з","х","ъ","ф","ы","в",
        "а","п","р","о","л","д","ж","э","я","с",
        "м","и","т","б","Ё","Й","Ю","Ч","Ь",
        "Щ","Ц","У","К","Е","Н","Г","Ш","З",
        "Х","Ъ","Ф","Ы","В","А","П","Р","О",
        "Л","Д","Ж","Э","Я","С","М","И","Т","Б");
        $eng = array("yo","iy","yu","'","ch","sh","c","u","k","e",
        "n","g","sh","z","h","'","f","y","v","a",
        "p","r","o","l","d","j","е","ya","s","m",
        "i","t","b","Yo","Iy","Yu","CH","'","SH",
        "C","U","K","E","N","G","SH","Z","H","'",
        "F","Y","V","A","P","R","O","L","D","J",
        "E","YA","S","M","I","T","B");
        $string = str_replace($rus, $eng,  $string);
        /***
         функция str_replace находит значения в строке и заменяет их новой. здесь мы повторили весь алфавит, как видите  ::):
         ***/

        if(!empty($string)) {
            return $string;
        } // если строка не пуста, возвращаем строку
        else return("String empty/Строка пуста"); // а если пуста, орем во всю глотку xD
    }

Источник jarmush.ru
21.12.2010, 12:44
Ответить

1234ru

Чем 100 раз str_replace вызывать, сделали бы уж массивы.

Кроме того, какой смысл имеет выражение public static для отдельно стоящей функции?

То, что не убивает нас, делает нас инвалидами.
21.12.2010, 14:30
Ответить

paulus

Ты же понимаешь, что смысл поста не в посте, а в ссылке на сайт, которую ты не стер ;)
21.12.2010, 17:02
Ответить
NO USERPIC

jarmush

1234ru
public static здесь потому что функция выдернута из работающего на Кохане проекта, там особая пространственноименная магия.
66 раз вызывается str_replace потому что надо было срочно и быстро сделать рабочую функцию, эти 66 строк сгенерены скриптом, а набивать массив не было времени.

Кстати, и впрямь, надо бы сделать красиво, а то за выходца из Поднебесной могут принять


UPDATED: С массивами то оно покрасивше, переделал код.
21.12.2010, 17:59
Ответить
NO USERPIC

jarmush


paulus
Ну вы меня прям раскусили, осуждайте меня, осуждайте.
За работающее решение - ссылка на меня, справедливо, нес па?
21.12.2010, 18:16
Ответить

paulus

Не обижайтесь, я тоже не удалил ссылку :)

Просто код и правда выглядит как странная копипаста, которую в собственные программы вставлять я бы постеснялся. Тем более, что особого смысла конвертить в транслит в utf8 нету: попробуйте сконвертировать в транслит слово citröen. А если игнорировать буквы-неудачницы, то хватит и обычного однобайтового режима.
21.12.2010, 18:45
Ответить
NO USERPIC

jarmush

У меня эта функция используется только в одном месте - приводит к латинице заголовки записей блога для получения человекопонятных URL (чтобы получилось что то вроде http://example.com/category/programmirovanie ). С этим она справляется. На вид страшна, спору нет. Кстати, благодаря вашей критике я собственно и нашел в себе силы ее переписать по человечески, обновил первый пост
21.12.2010, 18:58
Ответить

paulus

Да, в таком виде выглядит в сотню раз лучше. Я бы еще по алфавиту буквы расставил — куда легче смотреть, что ни одна не пропущена :)
21.12.2010, 19:30
Ответить

1234ru

paulus
попробуйте сконвертировать в транслит слово citröen


Заголовок статьи: Перевод в транслит русских и украинских текстов

ö относится к русскому или украинскому языкам? :)
То, что не убивает нас, делает нас инвалидами.
22.12.2010, 22:23
Ответить

1234ru

jarmush, иметь ссылку на кого-то имеет смысл, если этот кто-то предоставляет качественный код.

А ваша функция даже не работает. public static убирать кто-то вместо вас должен? Вы за такое удовольствие хотите ссылку на себя иметь?

И расставьте действительно буквы по алфавиту, а также сделайте их не больше чем по 7 в строке, а не все в одну. Плюс воспользуйтесь конструкциями syntax (на форме комментария кнопка справа вверху).
То, что не убивает нас, делает нас инвалидами.
22.12.2010, 22:31
Ответить
NO USERPIC

jarmush

Цитата:
А ваша функция даже не работает.

у меня работает моя, но не работает ваша

Цитата:
сделайте их не больше чем по 7 в строке, а не все в одну. Плюс воспользуйтесь конструкциями syntax

сделал
Почему бы вам в свою очередь в форме добавления коментария не сделать кнопку Code, которая будет помещать код в контейнер с overflow: auto?

Цитата:
расставьте действительно буквы по алфавиту

Это лишнее. Если считаете нужным - правьте.

Цитата:
иметь ссылку на кого-то имеет смысл, если этот кто-то предоставляет качественный код.

Опять же, если считаете нужным - удалите.
22.12.2010, 23:05
Ответить

paulus

Миш, это я к тому, что однобайтовой кодировки в данном случае хватит за глаза.

Кстати, вариант Jarmush не обрабатывает буквы ї и є. Но это правда всё мелочи.
23.12.2010, 14:36
Ответить
Добавить комментарий
Отображение комментариев: Древовидное | Плоское
© 2008—2024 webew.ru, связаться: x собака webew.ru
Сайт использует Flede и соответствует стандартам WAI-WCAG 1.0 на уровне A.
Rambler's Top100

Реклама: протезирование зубов