Laravel变音符号不敏感搜索

问题描述 投票:0回答:1

我尝试创建一个接受Query参数的API来过滤以下链接api/results/search?somefield=er中的结果。我期待的结果应该是例如:

  • 文学
  • 实现
  • 得到
  • 受损

简而言之,谷歌Chrome的实际版本正是我所需要的,当您在谷歌浏览器中按CTRL+F并尝试在此页面上搜索er时,您将获得https://fr.lipsum.com/ér的全文搜索。

我正在使用Laravel Collection而不是Eloquent。

为了使搜索大小写不敏感,PHP已经有一个名为qazxsw poi的函数

er

现在我陷入困境,关于如何正确搜索变音字母(法语/西班牙语等等)。

我已经制作了一个字符列表,但不知道如何使用代码。

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' => ['ξ'], ] ]; 的简单方法?

感谢任何给定的想法。

php regex laravel full-text-search
1个回答
1
投票

你实际上并不需要创建自己的列表Laravel有一个名为preg_match的方法,它可以将非ascii字符转换为它们的ascii等价物,所以你可以这样做:

stristr()

Str::ascii中还有第二个参数用于语言,尽管从我看到的你只需要用它来表示bg(保加利亚语)或de(德语)

如果你需要检查整个列表是什么,你可以看到qazxsw poi,它也提到它是基于qazxsw poi库。

底线是不写自己的列表,除非已经存在的列表不够。

请注意,还可以选择使用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)); }); } ,它将音译非ascii字符。更多信息在Str::ascii

© www.soinside.com 2019 - 2024. All rights reserved.