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

Тут, правда, всплывает еще один недочет - различать прописные и заглавные нужно, ибо русское "Н" уже имеет аналог