我需要实现一个小搜索引擎。问题是,数据库中有数据使用而不是像äöü字母那样的字母。我需要有可能找到它们。我可以使用我的正则表达式生成器函数轻松完成此任务:
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<。到目前为止一切都很好。
但数据库中也有“Renés”。当我使用RLIKE时,我无法通过输入“Rene”找到它们。另一方面,如果我使用> LIKE $ string<,则在输入“Rene”时会发现“René”,但在那里使用正则表达式是不可能的。
我现在用谷歌搜索了几个小时,我在这里也发现了一些类似的话题。但到目前为止还没有一个真正的解决方案。我考虑的是我可以选择字段并在其上应用REGEX REPLACE,如REPLACE(字段,[^ a-z],'_')(非有效代码)并使用LIKE。
有没有人有线索?
答案 0 :(得分:1)
好的,我自己找到了答案。这可能不是最好的做法。但我工作正常。所以,如果你有几个字符可以写成,就像在我的情况下,德语“ö”作为“oe”你可以像这样构建你的查询:
... WHERE REPLACE(LOWER(c_name), 'ö', 'oe') COLLATE utf8_general_ci
LIKE '".mysqli_real_escape_string($link, $search)."' ...
然后它不仅会通过输入“moeglich”(反之亦然)找到“möglich”,而且通过搜索“rene”(反之亦然)找到“rené”
此外,您还必须转换搜索查询中的字符:
$string = str_replace(array('ä', 'ö', 'ü', 'ß'),
array('ae', 'oe', 'ue', 'ss'),
mb_strtolower($string));
就是这样。我希望这可以帮助某人:)