2016-03-03 5 views
0

Мне нужно реализовать небольшую поисковую систему. Проблема в том, что в базе данных есть данные, которые используются вместо букв, таких как буквы ae oe ue. Мне нужна возможность их найти. Я могу сделать это легко с моей функции регулярных выражений-генератора:mysql LIKE и regex VS RLIKE и диакритические символы

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 $ строка <. Все идет нормально.

Но есть и «Renés» в базе данных. Когда я использую RLIKE, я не могу найти их, войдя в «Рене». С другой стороны, если я использую> LIKE $ string <, он находит «René» при входе в «Rene», но использование регулярного выражения там невозможно.

Я гугл в течение нескольких часов, и я также нашел несколько похожих тем здесь. Но до сих пор не было реального решения.

Я считаю, что я мог бы SELECT полей и применять REEX REPLACE на нем как REPLACE (поле, [^ a-z], '_') (недействительный код) и использовать LIKE.

У кого-нибудь есть ключ?

+1

Интересное имя метода. –

+0

рад, что вам понравилось 3 :) – Bernhard

+0

Какая у вас версия mysql? –

ответ

0

Хорошо, я нашел ответ сам. Это не лучшая практика. Но я отлично работаю. Так что если у вас есть несколько символов, которые могут быть записаны иначе, как в моем случае, немецкие «ö», как «О.Е.» вы можете создать свой запрос следующим образом:

... WHERE REPLACE(LOWER(c_name), 'ö', 'oe') COLLATE utf8_general_ci 
    LIKE '".mysqli_real_escape_string($link, $search)."' ... 

, то он найдет не только «möglich» набрав «moeglich» (и наоборот), но и «René» путем поиска «Rene» (и наоборот)

дополнительно необходимо преобразовать символы в поисковом запросе также:

$string = str_replace(array('ä', 'ö', 'ü', 'ß'), 
         array('ae', 'oe', 'ue', 'ss'), 
         mb_strtolower($string)); 

thats it. Надеюсь, это может помочь кому-то :)

 Смежные вопросы

  • Нет связанных вопросов^_^