2016-03-03 77 views
0

我需要實現一個小搜索引擎。問題是,數據庫內部的數據使用的是字母而不是字母,例如字母和數字。我需要找到他們的可能性。我可以用我的正則表達式生成器功能很容易做到這一點:mysql LIKE和正則表達式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時,我無法通過輸入「Rene」找到它們。另一方面,如果我使用> LIKE $字符串<,它會在輸入「Rene」時找到「René」,但在那裏不能使用正則表達式。

我搜索了幾個小時,現在我也發現了幾個類似的主題。但迄今爲止還沒有真正的解決方案。

我認爲我可以選擇字段並像REPLACE(field,[^ a-z],'_')(無效代碼)一樣對其應用REGEX REPLACE並使用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」(反之亦然),也有「勒」

另外你在搜索查詢變換角色太:

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

多數民衆贊成它。我希望這可以幫助某人:)