Laravel диакритический нечувствительный поиск

Я пытаюсь сделать API, который принимает параметры запроса для фильтрации результатов по следующей ссылке api/results/search?somefield=er, Результаты, которые я ожидаю, должны быть, например:

  • Littérature
  • REALISэр
  • procurэр
  • альтérEe

Короче говоря, актуальная версия Google Chrome имеет именно то, что мне нужно, при нажатии CTRL+F в Google Chrome и попробуйте найти er на этой странице https://fr.lipsum.com/ Вы получите полнотекстовый поиск с основными моментами ér а также er,

Я использую коллекцию Laravel вместо Eloquent.

Для упрощения поиска в PHP уже есть функция для этого случая, которая называется stristr (стог сена, игла)

foreach (request()->except('perPage') as $key => $value) {
$results = $results->filter(function ($item) use ($key, $value) {
return false !== stristr($item->$key, $value);
});
}

Теперь я застрял в том, как правильно искать диакритические буквы (французский / испанский / и т. Д. Акценты).

Я уже составил список символов, но понятия не имею, как его использовать.

return [
'siblings' => [
'A'  => ['À', 'Á', 'Â', 'Ã', 'Å', 'Ǻ', 'Ā', 'Ă', 'Ą', 'Ǎ', 'Α', 'Ά', 'Ả', 'Ạ', 'Ầ', 'Ẫ', 'Ẩ', 'Ậ', 'Ằ', 'Ắ', 'Ẵ', 'Ẳ', 'Ặ', 'А'],
'B'  => ['B'],
'C'  => ['Ç', 'Ć', 'Ĉ', 'Ċ', 'Č'],
'D'  => ['Ð', 'Ď', 'Đ', 'Δ'],
'E'  => ['È', 'É', 'Ê', 'Ë', 'Ē', 'Ĕ', 'Ė', 'Ę', 'Ě', 'Ε', 'Έ', 'Ẽ', 'Ẻ', 'Ẹ', 'Ề', 'Ế', 'Ễ', 'Ể', 'Ệ', 'Е', 'Э'],
'F'  => ['ƒ'],
'G'  => ['Ĝ', 'Ğ', 'Ġ', 'Ģ'],
'H'  => ['Ĥ', 'Ħ'],
'I'  => ['Ì', 'Í', 'Î', 'Ï', 'Ĩ', 'Ī', 'Ĭ', 'Ǐ', 'Į', 'İ', 'Η', 'Ή', 'Ί', 'Ι', 'Ϊ', 'Ỉ', 'Ị'],
'J'  => ['Ĵ'],
'K'  => ['Ķ', 'Κ', 'К'],
'L'  => ['Ĺ', 'Ļ', 'Ľ', 'Ŀ', 'Ł', 'Λ', 'Л'],
'M'  => [''],
'N'  => ['Ñ', 'Ń', 'Ņ', 'Ň', 'Ν'],
'O'  => ['Ò', 'Ó', 'Ô', 'Õ', 'Ō', 'Ŏ', 'Ǒ', 'Ő', 'Ơ', 'Ø', 'Ǿ', 'Ο', 'Ό', 'Ω', 'Ώ', 'Ỏ', 'Ọ', 'Ồ', 'Ố', 'Ỗ', 'Ổ', 'Ộ', 'Ờ', 'Ớ', 'Ỡ', 'Ở', 'Ợ', 'О'],
'P'  => [''],
'R'  => ['Ŕ', 'Ŗ', 'Ř'],
'S'  => ['Ś', 'Ŝ', 'Ş', 'Ș', 'Š', 'Σ'],
'T'  => ['Ț', 'Ţ', 'Ť', 'Ŧ', 'Τ', 'Т'],
'U'  => ['Ù', 'Ú', 'Û', 'Ũ', 'Ū', 'Ŭ', 'Ů', 'Ű', 'Ų', 'Ư', 'Ǔ', 'Ǖ', 'Ǘ', 'Ǚ', 'Ǜ', 'Ủ', 'Ụ', 'Ừ', 'Ứ', 'Ữ', 'Ử', 'Ự'],
'X'  => [''],
'Y'  => ['Ý', 'Ÿ', 'Ŷ', 'Υ', 'Ύ', 'Ϋ', 'Ỳ', 'Ỹ', 'Ỷ', 'Ỵ'],
'W'  => ['Ŵ'],
'Z'  => ['Ź', 'Ż', 'Ž', 'Ζ'],
'AE' => ['Ä', 'Æ', 'Ǽ'],
'UE' => ['Ü'],
'IJ' => ['IJ'],
'OE' => ['Ö', 'Œ'],
'TH' => ['þ'],
'SS' => ['ß'],
'KS' => ['ξ'],
]
];

Я был бы очень признателен, если бы кто-нибудь подскажет мне, какой подход я должен использовать. Я считаю, что мне нужно использовать preg_match, но, возможно, есть более простой способ, похожий на stristr() ?

спасибо за любую идею.

0

Решение

На самом деле вам не нужно составлять собственный список. У Laravel есть метод Str::ascii который будет преобразовывать не-ASCII символы в их ASCII-эквивалент, так что вы бы сделали:

foreach (request()->except('perPage') as $key => $value) {
$results = $results->filter(function ($item) use ($key, $value) {
return false !== stristr(\Str::ascii($item->$key), \Str::ascii($value));
});
}

Там также 2-й параметр в Str::ascii для языка, хотя из того, что я видел, вам нужно использовать его только для bg (болгарский) или de (немецкий)

Если вам нужно проверить, что весь список вы можете увидеть источник который также упоминает, что он основан на волокнистый библиотека.

Суть в том, что не пишите свой собственный список, если вам уже не хватает уже существующих.

Обратите внимание, что есть также возможность использования iconv("UTF-8", "ASCII//TRANSLIT", $string) который транслитерирует не ascii символы. Больше информации на iconv

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector