UDAV99
@UDAV99
web программист, верстальщик

Как искать слово/фразы (не точное соответстие) после перевода в транслит с Грузинского?

Подскажите пожалуйста как быть...

Есть сайт на грузинском языке .. нужно перевести в транслит все странички (допустим ограничимся пока названиями) и сделать возможность поиска по переведенному транслиту, НО чтобы искать можно было по не точному совпадению слова.

Например есть "Втулка для хрени" (берем образно Русское название), транслит его должен перевести в несколько вариантов: (это как я думаю)
vtulka dlya hreni
vtylka dla xreni
vtulka dlya hreny

и при поиске будет охватывать много вариантов.. понятное дело что это далеко не все варианты написания и записать все просто не реально будет...

Как бы сделать возможность искать по транслитированному грузинскому с неточными совпадениями?
  • Вопрос задан
  • 112 просмотров
Пригласить эксперта
Ответы на вопрос 1
@errogaht
PHP developer
Недавно писал для похожей задачи, но только на английском код, который делает транслит слова с Английского на Русский в разных вариантах. Похоже что вам нужно только подправить массив словаря:
<?php

$dic = [
    'a' =>['а','э'],
    'b' =>['б'],
    'c' =>['ц','к','с'],
    'd' =>['д'],
    'e' =>['е','и'],
    'f' =>['ф'],
    'g' =>['г'],
    'h' =>['х'],
    'i' =>['и','ай'],
    'j' =>['ж','дж'],
    'k' =>['к'],
    'l' =>['л','ль'],
    'm' =>['м'],
    'n' =>['н'],
    'o' =>['о'],
    'p' =>['п'],
    'q' =>['к','кью'],
    'r' =>['р'],
    's' =>['с'],
    't' =>['т'],
    'u' =>['у','ы','и'],
    'v' =>['в'],
    'w' =>['в'],
    'x' =>['к+с'],
    'y' =>['у','и'],
    'z' =>['з'],
    'sh'=>['ш'],
    'shch'=>['щ'],
    'ch'=>['ч','х', 'к'],
    'rr'=>['р'],
    'ss'=>['с'],
    'tt'=>['т'],
    'ff'=>['ф'],
    'ack'=>['эк'],
    'uck'=>['ак'],
    'aby'=>['эйби'],
    'wat'=>['вот'],
    'excl'=>['экскл'],
    'qu'=>['ку', 'кью'],
    'ei'=>['эй', 'ей'],
    'igh'=>['ай'],
    'cre'=>['кре'],
    'ang'=>['эндж'],
    'gi'=>['джи'],
    'jea'=>['джи'],
    'ae'=>['ае'],
    'tion'=>['шн'],
    'ice'=>['ис', 'айс'],
    'ph'=>['ф'],
    'ow'=>['оу'],
    'ia'=>['ия'],
];

$input = 'Jack';

uksort($dic, function ($a, $b) {
    $a = strlen($a);
    $b = strlen($b);
    if ($a == $b) {
        return 0;
    }
    return ($a > $b) ? -1 : 1;
});

$i = strtolower($input);
$res = [$i => $i];


function asdf($dic, $res) {
    $resBefore = $res;
    foreach ($dic as $token => $variants) {
        do {
            $input = array_shift($res);
            if (strpos($input, $token) !== false) {
                foreach ($variants as $variant) {

                    $replaced = str_replace($token, $variant, $input);
                    if (!empty($replaced) && $replaced !== $input) {
                        $res[$replaced] = $replaced;

                    }
                }
                if (strlen($token) > 1) {
                    $res[$input] = $input;
                }
            } else {
                $res[$input] = $input;
                break;
            }
        } while ($input !== null);
    }
    if (!empty(array_diff($res, $resBefore))) {
        $res = asdf($dic, $res);
    }
    return $res;
}
$result = array_values(asdf($dic, $res));

var_dump($result);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽