У меня есть функция PHP для преобразования текста из кириллицы в латиницу.Эта функция правильно реагирует, когда присутствует только одно слово, но есть ошибки с предложениями и длинными словами.
Теперь у меня есть эта функция.
public static function CyrToLat($word)
{
$index = 0;
$length = mb_strlen($word, self::$unicode);
$result = "";
// by rules
while ($index < $length) {
$ch = mb_substr($word, $index, 1, self::$unicode);
$prevch = ($index > 0) ? mb_substr($word, $index - 1, 1, self::$unicode) : "";
$nextch = ($index + 1) < $length ? mb_substr($word, $index + 1, 1, self::$unicode) : "";
$resch = "";
for ($i = 0; $i < count(self::$c2l); $i++) {
if (self::$c2l[$i][0] == $ch) {
$resch = self::$c2l[$i][1];
}
}
// if the letter is not on the schedule
if (mb_strlen($resch, self::$unicode) == 0) {
if ($ch == "e") {
if ($index == 0 || self::IsVowelCyr($prevch)) {
$resch = "ye";
} else {
$resch = "e";
}
} else if ($ch == 'ц') {
if ($index == 0 || $index == $length - 1) {
$resch = "s";
} else if ($index > 0 && self::IsConsonantCyr($prevch)) {
$resch = "s";
} else {
$resch = "ts";
}
} else if ($ch == 'Ц') {
if ($index == 0 || $index == $length - 1) {
$resch = "S";
} else if ($index > 0 && self::IsConsonantCyr($prevch)) {
$resch = "ts";
} else {
$resch = "ts";
}
} elseif ($ch == "ъ" || $ch == "Ъ") {
if (mb_strtolower($prevch, self::$unicode) != "ў") {
$resch = self::$apostroph1;
} else {
$resch = "";
}
} else if (($ch == "ь" || $ch == "Ь")) {
if (self::IsConsonantCyr($prevch) && self::IsVowelCyr($nextch)) {
$resch = "y";
} else {
$resch = "";
}
} else {
$resch = $ch;
}
}
// Correct the letter register
// Шанба=>Shanba (not SHanba), АЁҚШ=>AYOQSH, МиЯ=>MiYa, ЯйЛоВ=>YayLoV
if (self::IsLcaseCyr($nextch) && mb_strlen($resch, self::$unicode) > 1 && $index < $length - 1) {
$resch = mb_substr($resch, 0, 1,
self::$unicode)
.mb_strtolower(mb_substr($resch, 1, 1, self::$unicode), self::$unicode);
}
if (self::IsUcaseCyr($nextch) && mb_strlen($resch, self::$unicode) > 1 && self::IsLcaseCyr($prevch)) {
$resch = mb_substr($resch, 0, 1, self::$unicode) .
mb_strtolower(mb_substr($resch, 1, 1, self::$unicode),
self::$unicode);
}
$result = $result . $resch;
$index++;
}
return $result;
}
Ниже у меня проблема.
// Correct the letter register
// Шанба=>Shanba (not SHanba), АЁҚШ=>AYOQSH, МиЯ=>MiYa, ЯйЛоВ=>YayLoV
if (self::IsLcaseCyr($nextch) && mb_strlen($resch, self::$unicode) > 1 && $index < $length - 1) {
$resch = mb_substr($resch, 0, 1,
self::$unicode)
.mb_strtolower(mb_substr($resch, 1, 1, self::$unicode), self::$unicode);
}
if (self::IsUcaseCyr($nextch) && mb_strlen($resch, self::$unicode) > 1 && self::IsLcaseCyr($prevch)) {
$resch = mb_substr($resch, 0, 1, self::$unicode) .
mb_strtolower(mb_substr($resch, 1, 1, self::$unicode),
self::$unicode);
}
Если я запускаю этот код, он работает правильно, но только для одного слова.
Например:
Если я введу Шанба , он вернет true
со значением Шанба
Но если я введу какой-нибудь текст, заглавные буквы или слова, он вернет false, например,
ШАНБА ОҚШОМИДА «ПСЖ» ФРАНЦИЯ КУБОГИ
Возвращает:
ШАНБА ОКШОМИДА «ПСЖ» ФРАНЦИЯ КУБОГИ ФИНАЛИДА СЕНСАЦИОН РАВИШДА.
Но должно возвращаться следующее значение:
ШАНБА ОКШОМИДА «ПСЖ» ФРАНЦИЯ КУБОГИ ФИНАЛИДА СЕНСАЦИОННАЯ РАВИШДА.
Я не знаю, где ошибка.Я не могу конвертировать длинные тексты и прописные слова.
Не могли бы вы дать мне совет?Заранее спасибо!