我尝试创建一个接受查询参数的API来过滤以下链接api/results/search?somefield=er
中的结果。我期待的结果应该是例如:
简而言之,Google Chrome的实际版本正是我所需要的,当您在Google Chrome中按CTRL+F
并尝试在此页https://fr.lipsum.com/上搜索er
时,您将获得包含ér
和er
精彩内容的全文搜索。
我正在使用Laravel Collection而不是Eloquent。
为了使搜索案例更加敏感,PHP已经为这种情况提供了一个名为stristr($haystack, $needle)的函数
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 :(得分:1)
你实际上并不需要制作自己的列表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));
});
}
虽然从我所见过的只需要用于bg(保加利亚语)或de(德语)
,Str::ascii
语言中也有第二个参数。
如果您需要查看整个列表的内容,可以查看the source,其中还提到它基于Stringy库。
除非已经存在的列表对您不够,否则底线不会编写您自己的列表。
请注意,还可以选择使用iconv("UTF-8", "ASCII//TRANSLIT", $string)
来音译非ascii字符。有关详情,请访问iconv