Я пытаюсь сделать API, который принимает параметры запроса для фильтрации результатов по следующей ссылке api/results/search?somefield=er
, Результаты, которые я ожидаю, должны быть, например:
Короче говоря, актуальная версия 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()
?
спасибо за любую идею.
На самом деле вам не нужно составлять собственный список. У 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
Других решений пока нет …