|
|
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 | Транслит русско-латинский, латинско-русский |