1

我需要实现一个小的搜索引擎。问题是,数据库中的某些数据使用字母 ae oe ue 而不是字母 ä ö ü。我需要找到他们的机会。我可以使用我的 regex-generator 函数轻松地做到这一点:

 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é”,但在那里无法使用正则表达式。

我现在用谷歌搜索了几个小时,我也在这里找到了一些类似的主题。但到目前为止还没有真正的解决方案。

我考虑的是我可以选择字段并在其上应用正则表达式替换,如 REPLACE(field, [^az], '_') (无效代码)并使用 LIKE。

有人有线索吗?

4

1 回答 1

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));

而已。我希望这可以帮助某人:)

于 2016-03-04T14:05:59.537 回答