(☞ຈل͜ຈ)☞ Главная  Статьи  Загрузчик Домой

Ok!
Ok!
159
function lat2cyr($s)
{
    $sb = "";
    $i = 0;
    $lc = false;
    while ($i < strlen($s)) {
        $ch = substr($s, $i, 1);
        $lc = ctype_lower($ch); // true/false
        $ch = mb_strtoupper($ch);
        if ($ch == 'J') { // Префиксная нотация вначале
            $i++; // преходим ко второму символу сочетания
            $ch = strtoupper(substr($s, $i, 1));
            switch ($ch) {
                case 'O':
                    $sb .= ch('Ё', $lc);
                    break;
                case 'H':
                    if ($i + 1 < strlen($s) && mb_strtoupper(substr($s, $i + 1, 1) == 'H')){ // проверка на постфикс (вариант JHH)
                        $sb .= ch('Ъ', $lc);
                        $i++; // пропускаем постфикс
                    }
                    else{
                        $sb .= ch('Ь', $lc);
                    }
                    break;
                case
                'U': $sb .= ch('Ю', $lc); break;
                case 'A': $sb = ch('Я', $lc); break;
                default: break;
            }
        } else if ($i + 1 < strlen($s) && mb_strtoupper(substr($s, $i + 1, 1)) == 'H') { // Постфиксная нотация, требует информации о двух следующих символах. Для потока придется сделать обертку с очередью из трех символов.
            switch ($ch) {
                case 'Z':
                    $sb .= ch('Ж', $lc);
                    break;
                case 'K':
                    $sb .= ch('Х', $lc);
                    break;
                case 'C':
                    $sb .= ch('Ч', $lc);
                    break;
                case 'S':
                    if ($i + 2 < strlen($s) && mb_strtoupper(substr($s, $i + 2, 1)) == 'H') { // проверка на двойной постфикс
                        $sb .= ch('Щ', $lc);
                        $i++; // пропускаем первый постфикс
                    } else {
                        $sb .= ch('Ш', $lc);
                    }
                    break;
                case 'E':
                    $sb .= ch('Э', $lc);
                    break;
                case 'I':
                    $sb .= ch('Ы', $lc);
                    break;
                default:
                    break;
            }
            $i++; // пропускаем постфикс
        } else {// одиночные символы
            switch ($ch) {
                case 'A':
                    $sb .= ch('А', $lc);
                    break;
                case 'B':
                    $sb .= ch('Б', $lc);
                    break;
                case 'V':
                    $sb .= ch('В', $lc);
                    break;
                case 'G':
                    $sb .= ch('Г', $lc);
                    break;
                case 'D':
                    $sb .= ch('Д', $lc);
                    break;
                case 'E':
                    $sb .= ch('Е', $lc);
                    break;
                case 'Z':
                    $sb .= ch('З', $lc);
                    break;
                case 'I':
                    $sb .= ch('И', $lc);
                    break;
                case 'Y':
                    if (mb_strtoupper(substr($s, $i + 1, 1) === ' ')){ // проверка на пробел после Y
                        $sb .= ch('И', $lc);
                        $i++; // пропускаем постфикс
                    }
                    else{
                        $sb .= ch('Й', $lc);
                    }
                    break;    
                case 'K':
                    $sb .= ch('К', $lc);
                    break;
                case 'L':
                    $sb .= ch('Л', $lc);
                    break;
                case 'M':
                    $sb .= ch('М', $lc);
                    break;
                case 'N':
                    $sb .= ch('Н', $lc);
                    break;
                case 'O':
                    $sb .= ch('О', $lc);
                    break;
                case 'P':
                    $sb .= ch('П', $lc);
                    break;
                case 'R':
                    $sb .= ch('Р', $lc);
                    break;
                case 'S':
                    $sb .= ch('С', $lc);
                    break;
                case 'T':
                    $sb .= ch('Т', $lc);
                    break;
                case 'U':
                    $sb .= ch('У', $lc);
                    break;
                case 'F':
                    $sb .= ch('Ф', $lc);
                    break;
                case 'C':
                    $sb .= ch('Ц', $lc);
                    break;
                default:
                    $sb .= ch($ch, $lc);
            }
        }

        $i++; // переходим к следующему символу
    }
    return (string)$sb;
}

function cyrlat($ch)
{
    switch ($ch) {
        case 'А':
            return "A";
        case 'Б':
            return "B";
        case 'В':
            return "V";
        case 'Г':
            return "G";
        case 'Д':
            return "D";
        case 'Е':
            return "E";
        case 'Ё':
            return "JO";
        case 'Ж':
            return "ZH";
        case 'З':
            return "Z";
        case 'И':
            return "I";
        case 'Й':
            return "Y";
        case 'К':
            return "K";
        case 'Л':
            return "L";
        case 'М':
            return "M";
        case 'Н':
            return "N";
        case 'О':
            return "O";
        case 'П':
            return "P";
        case 'Р':
            return "R";
        case 'С':
            return "S";
        case 'Т':
            return "T";
        case 'У':
            return "U";
        case 'Ф':
            return "F";
        case 'Х':
            return "KH";
        case 'Ц':
            return "C";
        case 'Ч':
            return "CH";
        case 'Ш':
            return "SH";
        case 'Щ':
            return "SHH";
        case 'Ъ':
            return "JHH";
        case 'Ы':
            return "IH";
        case 'Ь':
            return "JH";
        case 'Э':
            return "EH";
        case 'Ю':
            return "JU";
        case 'Я':
            return "JA";
        default:
            return $ch;
    }
}

function cyr2lat($s)
{
    $sb = "";
    $ch = preg_split('//u', $s, null, PREG_SPLIT_NO_EMPTY);
    
    for ($i = 0; $i < count($ch); $i++) {
        $lc = preg_match('~^p{Lu}~u', $ch[$i]) ? 0 : 1;
        $v = $ch[$i];
        $l = mb_strtoupper($v);
        $c = cyrlat($l);
        $lat = ch($c, $lc);
        $sb .= $lat;
    }
    return $sb;
}

/**
 * Вспомогательная функция для восстановления регистра
 */
function ch($ch, $tolower)
{
    return $tolower ? mb_strtolower($ch) : mb_strtoupper($ch);
}



echo cyr2lat("провинции Арма") . "
";
echo lat2cyr("Provinces of Lightness") . "
";


транслит, ретранслит100Транслит русско-латинский, латинско-русский
1 2 3 4 5 6 7 8 9 10 11 12 13