Незаметные латинские символы в строке

Zver1992

Новичок
Незаметные латинские символы в строке

Хочеться попросить совета по поводу этой функции.
Основная задача - перебор базы ключей (обычные фразы по 2-4 слова через пробел) и исправление ошибочных незаментных латинских символов в строке. Ну то есть латинская "a" и русская "a" на глаз совсем не отличаются, а поправить необходимо. Работает функция очень просто. Считаются количество русских символов в слове, затем количество возможных ошибок. Если русских в два и больше раз больше чем ошибочных, то слово русское с ошибочными символами, соотвественно, правим.
Можно ли как-нибудь это сделать лучше?

PHP:
/* Исправляем битые ключи */
    function fix_keyword($keyword)
    {
        /* Русские буквы */
        $russian_alphabet = array(
            'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж',
            'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о',
            'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц',
            'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю',
            'я'
        );

        /* Левые буквы */
        $error_alphabet = array(
            'a', 'e', 'k', 'o', 'p', 'c', 'y', 'x',
            'm', 't', 'n', 'u'
        );

        /* Правильные буквы */
        $right_alphabet = array(
            'а', 'е', 'к', 'о', 'р', 'с', 'у', 'х',
            'м', 'т', 'п', 'и'
        );

        /* Уникальные русские буквы */
        $unique_russian_alphabet = array(
            'б', 'в', 'г', 'д', 'ё', 'ж', 'з', 'й',
            'ъ', 'ы', 'ь', 'э', 'ю', 'я'
        );

        /* Уникальные латинские буквы */
        $unique_latin_alphabet = array(
            'b', 'd', 'f', 'g', 'h', 'i', 'j', 'l',
            'q', 'r', 's', 'v', 'w', 'z'
        );

        /* Делим фразу на слова */
        $words = explode(' ', $keyword);

        foreach($words as &$word) {
            /* Обнуляем счётчики */
            $russian_count = 0;
            $error_count = 0;
            $unique_russian_count = 0;
            $unique_latin_count = 0;

            /* Считаем количество русских букв */
            foreach($russian_alphabet as $russian_chr) {
                $russian_count += substr_count($word, $russian_chr);
            }

            /* Считаем количество ошибочных букв */
            foreach($error_alphabet as $error_chr) {
                $error_count += substr_count($word, $error_chr);
            }

             /* Считаем количество уникальных русских букв */
            foreach($unique_russian_alphabet as $unique_russian_chr) {
                $unique_russian_count += substr_count($word, $unique_russian_chr);
            }
            
            /* Считаем количество уникальных латинских букв */
            foreach($unique_latin_alphabet as $unique_latin_chr) {
               $unique_latin_count += substr_count($word, $unique_latin_chr);
            }

            /* Ошибки есть, заменяем */
            if($error_count > 0 && ($russian_count / $error_count >= 1 || $unique_russian_count > 0) && $unique_latin_count == 0) {
                $word = str_replace($error_alphabet, $right_alphabet, $word);
            }
        }

        /* Сшиваем фразу обратно */
        $keyword = implode(' ', $words);

        return $keyword;
    }
 

Mozart

Новичок
а просто заменить латинские на русские без лишних действий не проще?
 

MiksIr

miksir@home:~$
Я так понимаю, что топикстартер хочет сделать такую замену в русских словах, не тронув при этом английские =)

Есть готовая функция substr_count
 

Zver1992

Новичок
Автор оригинала: Mozart
а просто заменить латинские на русские без лишних действий не проще?
Автор оригинала: MiksIr
Я так понимаю, что топикстартер хочет сделать такую замену в русских словах, не тронув при этом английские =)

Есть готовая функция substr_count
Угу, правильно. Иначе у меня получится обратный эффект. Русские поправлю, английские давай править :)

За функция спасибо. Я просто гугланул чуток, по первым 2-3 ссылкам обсуждали как написать. Подумал что задача то элементарная и написал сам. Поправил.
 

MiksIr

miksir@home:~$
На самом деле задача не имеет 100% решения без использования словарей. Например, слово хер =) А вот слово хрен можно было бы поправить, если ввести еще одну проверку - на наличие "несовпадающих" букв. В английском не аналога прописной "н", а значит "хре" можно менять на русский ;) Тут, правда, всплывает еще один недочет - различать прописные и заглавные нужно, ибо русское "Н" уже имеет аналог ;)
 

Zver1992

Новичок
Автор оригинала: MiksIr
На самом деле задача не имеет 100% решения без использования словарей. Например, слово хер =) А вот слово хрен можно было бы поправить, если ввести еще одну проверку - на наличие "несовпадающих" букв. В английском не аналога прописной "н", а значит "хре" можно менять на русский ;) Тут, правда, всплывает еще один недочет - различать прописные и заглавные нужно, ибо русское "Н" уже имеет аналог ;)
И еще раз спасибо. Правда задача у нас очень узконаправленная - буквы только строчные, а вот с использованием уникальных символов сейчас реализую.

ОБНОВЛЕНИЕ: Добавил проверку уникальных букв, добавил исправление некоторых букв (совсем не одинаковые, но похожие).
 
Сверху