Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [polskie znaki] wyszukiwanie
flashdev
post 7.08.2009, 12:06:03
Post #1





Grupa: Zarejestrowani
Postów: 812
Pomógł: 117
Dołączył: 2.12.2008

Ostrzeżenie: (10%)
X----


W jaki sposób implementuje się wyszukiwanie w bazie danych zawierającej polskie znaki, dysponując w zapytaniu ciągiem bez polskich znaków?

Czy można zbudować zapytanie tak, aby każdy porównywany ciąg był uprzednio przetworzony przez dowolną funkcję w php.
Czy może są gotowe funkcje w MySql działające w poniższy sposób:
  1. <?php
  2. function bezPolskich($str){
  3. $str = str_replace('ą', 'a', $str);
  4. $str = str_replace('ę', 'e', $str);
  5. ...
  6. return $str;
  7. }
  8. ?>


--------------------
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
erix
post 7.08.2009, 12:56:59
Post #2





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
Czy można zbudować zapytanie tak, aby każdy porównywany ciąg był uprzednio przetworzony przez dowolną funkcję w php.

SOUNDEX.


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
flashdev
post 8.08.2009, 23:06:58
Post #3





Grupa: Zarejestrowani
Postów: 812
Pomógł: 117
Dołączył: 2.12.2008

Ostrzeżenie: (10%)
X----


To może inaczej. Wymyśliłem sposób na rozwiązanie problemu, ale nie wiem czy jest wystarczająco dobry (szybki).

Powiedzmy, że w bazie danych mam słowo "słownik", którego użytkownik szuka.

wpisuje do wyszukiwarki: "slownik"

W skrypcie php odpowiednia funkcja zamienia mi "l" -> "(l|ł)", i dodaje odpowiednie znaki, jak poniżej:
^(s|ś)(l|ł)(o|ó)w(n|ń)ik$

Następnie wykonuje zapytanie REGEXP i wszyscy są zadowoleni, bo użytkownik znalazł to czego szukał smile.gif


Niestety to rozwiązanie jest dużo wolniejsze od zwykłego zapytania ze znakiem przyrównania.
Ale być może jest najlepsze?
Proszę o jakieś sugestie na ten temat bardziej doświadczonych programistów, zanim zaimplementuje to rozwiązanie w swoim skrypcie.

Edit:

Dodam funkcję, którą napisałem na własne potrzeby na wypadek, gdyby pomysł komuś się spodobał:
  1. function makeRegExpPl($str){
  2. $old = array('e', 'o', 'a', 's', 'l', 'z', 'c', 'n', 'E', 'O', 'A', 'S', 'L', 'Z', 'C', 'N');
  3. $new = array('(e|ę)', '(o|ó)', '(a|ą)', '(s|ś)', '(l|ł)', '(z|ż|ź)', '(c|ć)', '(n|ń)', '(E|Ę)', '(O|Ó)', '(A|Ą)', '(S|Ś)', '(L|Ł)', '(Z|Ż|Ź)', '(C|Ć)', '(N|Ń)');
  4. return '^'.str_replace($old, $new, $str).'$';
  5. }


Oczywiście mile widziane sugestie, gdyby coś dało się zoptymalizować.

Ten post edytował flashdev 9.08.2009, 00:33:57


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 15.06.2025 - 05:16