Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> strtolower nie działa..., jak porównać polskie litery (Ł vs. ł)?
codo
post
Post #1





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 31.10.2004

Ostrzeżenie: (0%)
-----


Mam juz tego dosyc... zaczelo sie od napisania wyszukiwarki. Po wpisaniu słowa "łódź" miała mi znaleźć takze te dane z bazy ktore zawierały "Łódź" a także "ŁÓDŹ". Wyszukiwanie bralo pod uwage jeszcze wiele innych kryteriow wiec nie dalo rady wszystkiego zamknac w jednym sqlu.
Wiec biore SELECT * FROM OBIEKTY.. i dalej jesli cos pasuje to wrzucam do tablicy wynikow.
Porownanie musi byc case insensitive czyli
to nie podziala:
  1. <?php
  2. echo &#092;"Ł \".strtolower(\"Ł\");// wypisze: Ł Ł
  3. ?>

nie dziala tez
  1. <?php
  2. stripos
  3. ?>

  1. <?php
  2.  
  3. if(strcasecmp(&#092;"ŁÓdŹ\",\"ź\")>=0) echo \"MATCH\"; else echo \"NIE MA\";
  4. // wypisze NIE MA
  5.  
  6. ?>


Ale
  1. <?php
  2.  
  3. if(strcasecmp(&#092;"Abc\",\"a\")>=0) echo \"MATCH\"; else echo \"NIE MA\";
  4. // wypisze MATCH
  5.  
  6. ?>


Co tu zrobić??(IMG:http://forum.php.pl/style_emoticons/default/exclamation.gif)
Go to the top of the page
+Quote Post
mdco
post
Post #2





Grupa: Zarejestrowani
Postów: 324
Pomógł: 5
Dołączył: 14.12.2004

Ostrzeżenie: (0%)
-----


Wyszukiwarkę najlepiej robić przy pomocy zapytań sql. Mozna zrobic nawet bardzo skomplikowane zapytanie które znajdą Ci wszystko. Tylko trzeba troche z tym powalczyć...(IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
codo
post
Post #3





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 31.10.2004

Ostrzeżenie: (0%)
-----


To jak zrobic zeby po wpisaniu Gdansk wyszukiwarka znalazła Gdańsk?
Go to the top of the page
+Quote Post
Vengeance
post
Post #4





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

Ostrzeżenie: (0%)
-----


zrobic o jednego wiecej WHERE, gdzie ten dodatkowy bedzie przyjmowal wartosc = '$nazwaMiastaPoPrzepuszczeniuPrzezFunkcje'

a funkcja o ktorej mowa, bedzie usuwac polskie znaki (tzn zastepywac je)
Go to the top of the page
+Quote Post
codo
post
Post #5





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 31.10.2004

Ostrzeżenie: (0%)
-----


Ale nie da sie napisac takiej funkcji efektywnie.... Ta funkcja musialaby zmienic Gdansk na Gdańsk

  1. SELECT *
  2. FROM TABELA WHERE OPIS LIKE %$szukane% OR OPIS LIKE %$szukane_z_polskimi_znakami%


Ale przeciez Gdansk =>
Gdańsk
Gdąnsk
Gdąńsk
....
JAk napisac taka funkcje?!
Go to the top of the page
+Quote Post
Vengeance
post
Post #6





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

Ostrzeżenie: (0%)
-----


Wiec może w bazie trzymaj nie 'Gdańsk' tylko 'Gdansk'.
Albo trzymaj tak i tak :] Problem zniknie
Go to the top of the page
+Quote Post
crash
post
Post #7





Grupa: Przyjaciele php.pl
Postów: 2 196
Pomógł: 2
Dołączył: 17.01.2004
Skąd: Sosnowiec

Ostrzeżenie: (0%)
-----


Napisz sobie funkcję w php, która zamieni Ci polskie znaki na _ i taki ciąg daj w zapytaniu SQL.
Go to the top of the page
+Quote Post
codo
post
Post #8





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 31.10.2004

Ostrzeżenie: (0%)
-----


Nie chcialbym dublowac danych w bazie... jest sporo rekordow... Z kolei nie widze mozliwosci napisania takiej funkcji.
Jak to zmienia polskie znaki na '_'?
czyli
  1. SELECT *
  2. FROM TABELA WHERE OPIS LIKE %$szukane% OR OPIS LIKE %$szukane_z_kreskami%


To nie zadziala jak trzeba.. Czy ktos moglbym rozwiazac ten problem? Chyba to nie taki rzadki przypadek, ze chce skorzystac z wyszukiwarki z polskimi znakami ktora bedzie dzialac jesli ktos nie ma polskich znakow...
Go to the top of the page
+Quote Post
Major
post
Post #9





Grupa: Zarejestrowani
Postów: 82
Pomógł: 0
Dołączył: 22.07.2004

Ostrzeżenie: (0%)
-----


Ogolnie zeby taka zamiana miała sens(dodatkowa kolumna z nazwa bez polskich fontów) trza polskie fontu zastapic unikatami, czyli np
Gdańsk by bylo Gda(n z kreska)sk
(IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) I wtedy mozemy wuszikiwać bez problemów (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
codo
post
Post #10





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 31.10.2004

Ostrzeżenie: (0%)
-----


Ok, dodalem nowa kolumne ale to nie rozwiazuje problemu. Wyszukiwarka ma szukac w nazwie, opisie oraz miescie.
Czyli musialbym zdublowac kolejne kolumny, w tym kolumne z opisem, czyli duzo miejsca by to zajmowalo...
A czy nie mozna by zwrocic wszystkich rekordow i potem wybrac te ktore sa ok? Wielki minus to to ze trzeba zawsze wybrac wszystkie rekordy...
Co o tym myslicie?
Go to the top of the page
+Quote Post
_Mateo
post
Post #11





Grupa: Zarejestrowani
Postów: 189
Pomógł: 0
Dołączył: 4.03.2005
Skąd: Jaworzno

Ostrzeżenie: (0%)
-----


  1. <?php
  2.  
  3. function filtruj_string($art) {
  4.  
  5.   $art=strtolower($art);
  6.   $art=str_replace('ł', 'l', $art);
  7.   $art=str_replace('ń', 'n', $art);
  8.   $art=str_replace('ą', 'a', $art);
  9.   $art=str_replace('ś', 's', $art);
  10.   $art=str_replace('ę', 'e', $art);
  11.   $art=str_replace('ó', 'o', $art);
  12.   $art=str_replace('ż', 'z', $art);
  13.   $art=str_replace('ź', 'z', $art);
  14.   $art=str_replace('ć', 'c', $art);
  15.   return $art;
  16. }
  17.  
  18. foreach ($tablica_z_wynikami as $art) {
  19.   $art_do_sprawdzenia=filtruj_string($art);
  20.   $szukany_ciag=filtruj_string($szukany_ciag);
  21.   if(eregi($art_do_sprawdzenia, $szukany_ciag)) {
  22.     echo $art;
  23.    }
  24. }
  25.  
  26. ?>


pewien nie jestem, ale chyba o to chodzi?
Go to the top of the page
+Quote Post
DaNTe
post
Post #12





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 7.01.2004
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Jak się nie boisz (czytaj jak nie masz setek userów) to możesz:
  1. <?php
  2.  
  3. function filtrujPl($tekst)
  4. {
  5.   return strtr($tekst, array(
  6.     'ł'=>'[ŁłLl]',
  7.     'ą'=>'[ĄąAa]',
  8.     'ń'=>'[ŃńNn]',
  9.     /*... itd ...*/
  10.     'Ł'=>'[ŁłLl]',
  11.     /*... itd ...*/
  12.   ))
  13. }
  14.  
  15. ?>


i potem
  1. "SELECT *
  2. FROM tab WHERE fld1 RLIKE '".filtrujPl('Gdańsk')."'"


RLIKE mozna też zastąpić REGEXP

To dotyczy MySQL - nie wiem jak w innych bazach

Ten post edytował DaNTe 15.07.2005, 13:26:49
Go to the top of the page
+Quote Post
codo
post
Post #13





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 31.10.2004

Ostrzeżenie: (0%)
-----


Cytat
Jak się nie boisz (czytaj jak nie masz setek userów) to możesz:
...
function filtrujPl($tekst)
{
  return strtr($tekst, array(
    'ł'=>'[ŁłLl]',
    'ą'=>'[ĄąAa]',
    'ń'=>'[ŃńNn]',
    /*... itd ...*/
    'Ł'=>'[ŁłLl]',
    /*... itd ...*/
  ))
}




i potem
SQL
"SELECT *
FROM tab
WHERE fld1 RLIKE '".filtrujPl('Gdańsk')."'"


Brzmi super...
Wklepałem ale dostaje:
  1. SELECT *
  2. FROM objects WHERE desc_pl RLIKE gd[AaAa]ńsk

Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in ....
to samo w przypadku
  1. SELECT *
  2. FROM objects WHERE desc_pl REGEXP gd[AaAa]ńsk

Dysponuje MySQLem...

Ten post edytował codo 15.07.2005, 17:39:07
Go to the top of the page
+Quote Post
DaNTe
post
Post #14





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 7.01.2004
Skąd: Katowice

Ostrzeżenie: (0%)
-----


a nie zapomniałeś o uszach ? zwróć uwagę, że powinno być
  1. REGEXP 'gd[AaĄą][ŃńNn]sk'


i nie wiem czemu masz AaAa a nie AaĄą

BTW: zawsze sobie sprawdzaj (w czasie debugu)
  1. <?php
  2. ?>

to ci dokladniej powie gdzie problem.

Ten post edytował DaNTe 19.07.2005, 13:57:38
Go to the top of the page
+Quote Post
codo
post
Post #15





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 31.10.2004

Ostrzeżenie: (0%)
-----


Ok, dziekuje uruchomilo sie REGEXP mam tylko jeszcze jedno pytanie:
Mam obiekt o nazwie "XYZ Otmuchów Duży". User wpisuje otmuchow wiec dostaje
  1. SELECT *
  2. FROM objects WHERE LOWER(name) REGEXP 'otmuch[óo]w'

ale dostaje brak wyników
za to na zapytanie:
  1. SELECT *
  2. FROM objects WHERE LOWER(name) REGEXP 'otmuch[óo]'

mam wynik... Jak zrobic zeby bylo dobrze?

Ten post edytował codo 20.07.2005, 14:27:26
Go to the top of the page
+Quote Post
vhris
post
Post #16





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 2.02.2009

Ostrzeżenie: (0%)
-----


Sam post jest już nieco przeterminowany ale dla osób szukając rozwiązania moge zaproponowac coś takiego:

Zakładając, że zmienna $temp to jest jakaś nazwa:

CODE
$temp = str_replace(array('Ą','Ż','Ź','Ć','Ś','Ę','Ń','Ł','Ó'),array('ą','ż','ź','ć','ś','ę','ń','ł','ó'),strtolower($temp));


Później juz standardowo do zapytania sql składamy:
CODE
$where = 'where lower(name) LIKE \''.$temp.'\'';


Ten sposób przynajmniej u mnie daje pozytywne wyniki.

Ten post edytował vhris 2.02.2009, 15:15:11
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 24.08.2025 - 06:08