Транслитерация текста на PHP

Транслит... Какое томное, волнующее слово! Вот и поговорим немного о транслитерации. Пишем WAP-сайт? Без транслита — никуда. Только посетителей терять.

Как же грамотно выполнить транслитерацию в PHP? А очень просто! В этом нам поможет функция strtr(). Отличная, скажу я вам, функция!

Имеет два формата вызова:

string strtr(string str, string from, string to);

Для замены типа "символ-на-символ". Возвращается копия строки str, в которой символ from[i] заменен на символ to[i] для всех допустимых i.

string strtr(string str, array replace_pairs);

Для замены типа "строка-на-строку". В массиве replace_pairs описаны возможные замены. Ключ элемента массива — это то, что заменяется, а значение элемента массива с этим ключом — то, на что заменяется. Возвращается копия строки str, с выполненными заменами.

Так как в транслите некоторые кириллические символы записываются двумя и более символами (ш = sh и т.д.), то будем использовать второй формат вызова strtr().

Напишем небольшой скрипт, который можно будет потом подключать к скриптам, где нужно выполнить транслитерацию.

<?php
$tr = array(
    "Ґ" => "G", "Ё" => "YO", "Є" => "E", "Ї" => "YI", "І" => "I",
    "і" => "i", "ґ" => "g", "ё" => "yo", "№" => "#", "є" => "e",
    "ї" => "yi", "А" => "A", "Б" => "B", "В" => "V", "Г" => "G",
    "Д" => "D", "Е" => "E", "Ж" => "ZH", "З" => "Z", "И" => "I",
    "Й" => "Y", "К" => "K", "Л" => "L", "М" => "M", "Н" => "N",
    "О" => "O", "П" => "P", "Р" => "R", "С" => "S", "Т" => "T",
    "У" => "U", "Ф" => "F", "Х" => "H", "Ц" => "TS", "Ч" => "CH",
    "Ш" => "SH", "Щ" => "SCH", "Ъ" => "'", "Ы" => "YI", "Ь" => "",
    "Э" => "E", "Ю" => "YU", "Я" => "YA", "а" => "a", "б" => "b",
    "в" => "v", "г" => "g", "д" => "d", "е" => "e", "ж" => "zh",
    "з" => "z", "и" => "i", "й" => "y", "к" => "k", "л" => "l",
    "м" => "m", "н" => "n", "о" => "o", "п" => "p", "р" => "r",
    "с" => "s", "т" => "t", "у" => "u", "ф" => "f", "х" => "h",
    "ц" => "ts", "ч" => "ch", "ш" => "sh", "щ" => "sch", "ъ" => "'",
    "ы" => "yi", "ь" => "", "э" => "e", "ю" => "yu", "я" => "ya"
);

function translit($cyr_str) {
    global $tr;
    return strtr($cyr_str, $tr);
}
?>

Пример использования. Файл use.php

<?php
    require("translit.php");
    $s = "Привет! :)";
    if ($_GET["enc"] == "latin") {
        echo translit($s);
    } else {
        echo $s;
    }
?>

При вызове скрипта через use.php?enc=latin — будет выдаваться "Privet! :)", при иных значениях enc — "Привет! :)".

P.S. Приведенный пример отличается простотой и незатейливостью. На то он и пример. Перед реализацией же транслитерации в условиях, приближенных к боевым, советую ознакомиться с моей статьей "Тотальная буферизация PHP-скриптов и... Светлое будущее" и узнать оттуда, как можно реализовать транслитерацию целых страниц "малой кровью".