Помогите мне создать новую функцию или изменить функцию correct()
чтобы результат работал case-insensitive
к case-insensitive
для ввода текста.
Пример использования метода correct()
:
$text = "Точик ТОЧИК точик ТоЧиК тоЧИК"; $text = correct($text, $base_words); echo "$text";
Вход: Точик ТОЧИК точик ТоЧиК тоЧИК
Выход: Тоҷик ТОҶИК тоҷик ТоҶиК тоҶИК
Ниже перечислены все массивы и функции, поэтому вы можете легко скопировать их:
$default_words = array ( 'бур', 'кори', 'давлати', 'забони', 'фанни' ); $base_words = array ( "точик" => "тоҷик", "точики" => "тоҷики", "точикон" => "тоҷикон", "чахонгир" => "ҷаҳонгир", "галат" => "ғалат", "уктам" => "ӯктам", ); $base_special_words = array ( "кори хатти" => "кори хаттӣ", "хатти аз" => "хаттӣ аз", "забони точики" => "забони тоҷикӣ", "точики барои" => "тоҷикӣ барои", "забони давлати" => "забони давлатӣ", "давлати дар" => "давлатӣ дар", "микёси чахони" => "миқёси ҷаҳонӣ", ); function correct($request, $dictionary) { $search = array("ғ","ӣ","ҷ","ҳ","қ","ӯ","Ғ","Ӣ","Ҷ","Ҳ","Қ","Ӯ"); $replace = array("г","и","ч","х","к","у","Г","И","Ч","Х","К","У"); $request = str_replace($search, $replace, $request); // replace special letters to default cyrillic letters $result = preg_replace_callback("/\pL+/u", function ($m) use ($dictionary) { $word = mb_strtolower($m[0]); if (isset($dictionary[$word])) { $repl = $dictionary[$word]; // Check for some common ways of upper/lower case // 1. all lower case if ($word === $m[0]) return $repl; // 2. all upper case if (mb_strtoupper($word) === $m[0]) return mb_strtoupper($repl); // 3. Only first letters are upper case if (mb_convert_case($word, MB_CASE_TITLE) === $m[0]) return mb_convert_case($repl, MB_CASE_TITLE); // Otherwise: check each character whether it should be upper or lower case for ($i = 0, $len = mb_strlen($word); $i < $len; ++$i) { $mixed[] = mb_substr($word, $i, 1) === mb_substr($m[0], $i, 1) ? mb_substr($repl, $i, 1) : mb_strtoupper(mb_substr($repl, $i, 1)); } return implode("", $mixed); } return $m[0]; // Nothing changes }, $request); return $result; }
вход
Кори хатти аз фанни забони точики барои забони давлати дар микёси чахони.
Вывод
Кори хаттӣ аз фанни забони тоҷикӣ барои забони давлатӣ дар миқёси ҷаҳонӣ.
Здесь, скорее всего, вам нужно исправить текст шаг за шагом, используя 3 массива. Мой алгоритм не дал подходящих результатов. И поэтому я создал массив, состоящий из двух слов ( $base_special_words
).
Вам нужно создать temp array
из элементов массива $base_special_words
из тех слов, которые встречаются в предложении. Массив temp выглядит так:
$temp_for_base_special_words = array ( "кори хатти", "хатти аз", "забони точики", "точики барои", "забони давлати", "давлати дар", "микёси чахони", );
Все эти слова встречаются в предложении. Затем мы вырезаем те слова, которые находятся в массиве temp. Вырезав эти слова из предложения, предложение выглядит так:
Полное предложение перед резкой:
Кори хатти аз фанни забони точики барои забони давлати дар микёси чахони. Точик мард аст.
Сокращенная часть предложения:
Кори хатти аз забони точики барои забони давлати дар микёси чахони
Предложение после резки:
фанни. Точик мард аст.
Затем оставшаяся часть предложения будет проверяться с помощью массива $ default_words и слова, которые находятся в этом массиве из предложения, разрезаются.
Приговор перед резкой на шаге 2:
фанни. Точик мард аст.
Режущая часть:
фанни
Предложение после резки:
. Точик мард аст.
Массив с отрезанными словами:
$temp_for_default_words = array("фанни");
Вырежьте эти слова из остальной части предложения, которые доступны в массиве $ base_words.
Приговор перед резкой на шаге 3:
. Точик мард аст.
Режущая часть:
Точик
Предложение после резки:
. мард аст.
Массив с отрезанными словами:
$temp_for_base_words = array ("точик");
Остальная часть предложения должна быть временно разрезана и скрыта, чтобы с ней не было никакого лечения.
Часть предложения для скрытых:
. мард аст.
И, в конце концов, вам нужно заменить три новых массива, используя словарь, и вернуть скрытую часть.
Использование `temp_for_base_special_words`:
Используя значения $temp_for_base_special_words
для поиска значений с ключами ( $temp_for_base_special_words[$value]
) в $base_special_words
и замените эти ключи на значение в тексте ввода.
Использование `temp_for_default_words`:
Используя значения $temp_for_default_words
для поиска значений с ключами ( $temp_for_default_words[$value]
) в $base_default_words
и замените эти ключи на значение в тексте ввода.
Использование `temp_for_default_words`:
Используя значения $temp_for_base_words
для поиска значений с ключами ( $temp_for_base_words[$value]
) в $base_words
и замените эти ключи на значение в тексте ввода.
Возвращение скрытой части текста для ввода координат
То, что @ctwheels хотели вам рассказать, это использовать str_ireplace (документацию) , если вы хотите исправить слово с учетом регистра.
<?php $test="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."; $word=explode(" ",$test); //This function is need for take all the words individually, the link of the function is above foreach($word as $key=>$value) if (array_key_exists($value,$YourArrayWithCorrectWord)) $word[$key]=$YourArrayWithCorrectWord[$value]; //This, if i don't make mistakes, take the correct word and assigns to the wrong word. $TestCorrect=implode(" ",$word); ?>
Если есть что-то, что вы не понимаете, напишите мне.
Надеюсь, я помог вам.
Документация: здесь документация о взрыве
Здесь документация о взрыве
Здесь документация array_key_exsist
PS У этого метода есть проблема, что вы не можете исправить два или более слова вместе.