我需要实现一个小搜索引擎。问题是,数据库中的数据使用的是字母,而不是像äüe oe ue这样的字母。我需要找到他们的可能性。我可以使用regex生成器函数轻松完成此操作:
function shittyumlauts($string){
$string = mb_strtolower($string);
$string = preg_replace('/(Ä|ä|ae)/i', '(ä|ae)', $string);
$string = preg_replace('/(Ö|ö|oe)/i', '(ö|oe)', $string);
$string = preg_replace('/(Ü|ü|ue)/i', '(ü|ue)', $string);
return $string;
}
我在查询中使用了一个>RLIKE$string但数据库中也有“renes”当我使用RLIKE时,我无法通过输入“Rene”来找到它们。另一方面,如果我使用>LIKE$string我在网上搜索了几个小时,也发现了一些类似的话题。但是到目前为止还没有一个真正的解决方案。
我考虑的是,我可以选择这些字段并对其应用REGEX替换,比如REPLACE(field,[^a-z],'''u')(无效代码)和like。
有人知道吗?
最佳答案
好吧,我自己找到了答案。这显然不是最佳做法。但我工作很好。因此,如果您有几个字符可以用其他方式编写,比如在我的例子中,德语中的“oe”是“oe”,那么您可以这样构建查询:
... WHERE REPLACE(LOWER(c_name), 'ö', 'oe') COLLATE utf8_general_ci
LIKE '".mysqli_real_escape_string($link, $search)."' ...
然后,它不仅可以通过键入“moeglich”找到“móglich”(反之亦然),还可以通过搜索“rene”找到“rene”(反之亦然)
此外,还必须转换搜索查询中的字符:
$string = str_replace(array('ä', 'ö', 'ü', 'ß'),
array('ae', 'oe', 'ue', 'ss'),
mb_strtolower($string));
就这样。我希望这能帮助某人:)