我尝试制作一个接受查询参数的 API 来过滤以下链接中的结果api/results/search?somefield=er
。我期待的结果应该是例如:
简而言之,Google Chrome 的实际版本正是我所需要的,当您按下CTRL+F
Google Chrome 并尝试er
在此页面上搜索https://fr.lipsum.com/ 时,您将获得包含以下内容的全文搜索é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()
?
感谢任何给定的想法。
你实际上不需要创建你自己的列表 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));
});
}
Str::ascii
该语言还有第二个参数,尽管从我所见,您只需要将它用于 bg(保加利亚语)或 de(德语)
如果您需要检查整个列表是什么,您可以查看源代码,其中还提到它基于Stringy库。
底线是不要写你自己的清单,除非已经存在的清单对你来说还不够。
请注意,还有使用iconv("UTF-8", "ASCII//TRANSLIT", $string)
which 将音译非 ascii 字符的选项。更多信息请访问iconv
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句