Функция php mb_substr () не работает с длинными и прописными словами? - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть функция 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);
            }

Если я запускаю этот код, он работает правильно, но только для одного слова.

Например:

  1. Если я введу Шанба , он вернет true со значением Шанба

  2. Но если я введу какой-нибудь текст, заглавные буквы или слова, он вернет false, например,

ШАНБА ОҚШОМИДА «ПСЖ» ФРАНЦИЯ КУБОГИ

Возвращает:

ШАНБА ОКШОМИДА «ПСЖ» ФРАНЦИЯ КУБОГИ ФИНАЛИДА СЕНСАЦИОН РАВИШДА.

Но должно возвращаться следующее значение:

ШАНБА ОКШОМИДА «ПСЖ» ФРАНЦИЯ КУБОГИ ФИНАЛИДА СЕНСАЦИОННАЯ РАВИШДА.

Я не знаю, где ошибка.Я не могу конвертировать длинные тексты и прописные слова.

Не могли бы вы дать мне совет?Заранее спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...