Рассмотрим решения задачи на примере улучшения поиска. На самом деле, данный подход может сработать и в других кейсах с пользовательским вводом информации. Сразу уточню, что для успешной работы приведенного мной кода потребуется поддержка библиотеки cURL на Вашем хостинге/сервере.
Метод getCorrectedString получает на вход строку, отправляет в "Спеллер" и, если обнаружены ошибки, исправляет их, возвращая уже корректный вариант.
/** * @param string $inputText * @return string */ function getCorrectedString(string $inputText): string { $resultText = $inputText; $curlContent = getUrlContent( 'http://speller.yandex.net/services/spellservice.json/checkTexts', [ 'text' => $inputText ], [ CURLOPT_TIMEOUT => 10, CURLOPT_CONNECTTIMEOUT => 10 ] ); if ( isset($curlContent['result']) && !empty($curlContent['result']) ) { $spellResult = current( json_decode($curlContent['result']) ); $correctionMap = []; foreach ($spellResult as $correction) { $correctionMap[$correction->word] = current($correction->s); } $resultText = str_replace( array_keys($correctionMap), array_values($correctionMap), $inputText ); } return $resultText; }
Следующий метод "служебный". Вынес в него непосредственно отправку запроса и получения результата с помощью cURL.
/** * @param string $url * @param array $postData * @param array $optionsList * @return array */ function getUrlContent( string $url, array $postData = [], array $optionsList = [] ) { $curl = curl_init(); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_URL, $url); if (!empty($postData)) { curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($postData)); } if (!empty($optionsList)) { foreach ($optionsList as $optionKey => $optionValue) { curl_setopt($curl, $optionKey, $optionValue); } } $result = [ 'result' => curl_exec($curl), 'errno' => curl_errno($curl), 'error' => curl_error($curl), 'http_code' => curl_getinfo($curl, CURLINFO_HTTP_CODE), ]; curl_close($curl); return $result; }
А теперь перейдем к делу. Добавим на страницу код:
$answerText = 'Клара у Карла укралла Huawey'; $responseText = getCorrectedString($answerText); echo $responseText;На экран скрипт выведет: "Клара у Карла украла Huawei" .
Теперь ничего нам не мешает использовать по аналогии инструмент и вместе с компонентом поиска, например, передавая на вход компоненту bitrix.search.page поисковую строку после её обработки методом getCorrectedString. Но этот способ имеет недостаток в виде неизбежного увеличения времени отклика поиска, т.к. на каждый запрос пользователя будет устанавливаться соединение с серверами Яндекса.
При желании можно немного допилить первоначальный вариант. А именно, вызывать поиск с учетом исправления запроса только в случае, если поисковая выдача не содержит результатов. Таким образом, если по первоначальному запросу результат поиска есть, то мы ограничиваемся этой выдачей. Если же результатов не найдено, то повторяем поиск, предварительно скорректировав тест запроса.