Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Wyrażenia regularne a polskie znaki diakrytyczne
molek
post 25.03.2011, 13:33:52
Post #1





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 25.03.2011

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


Witam

Posiadam baze, która w tabeli haslo przechowuje kilkadziesiąt tysięcy słów.
Tabela haslo składa się z trzech kolumn:
id
slowo
dlugosc_slowa

Z wykorzystaniem wyrażeń regularnych chciałbym np. wyszukać losowe czteroliterowe słowo zaczynające się na literę 'l'
robię to za pomocą zapytania:

Kod
SELECT * FROM haslo
WHERE slowo REGEXP '[l]...$' and dlugosc_slowa = 4 ORDER BY RAND( ) LIMIT 1


Zapytanie zwraca poprawne rezultaty (np. lada, list) dopóki nie napotka na polskie znaki,
jeśli w sprawdzanym słowie napotka na polski ogonek to potrafi zwrócić np. zlać lub pląs - wyrazy czteroliterowe ale nie zaczynające się na litere 'l'

kodowanie utf8
metoda porównywania napisów to utf8_polish_ci

Jak sobie z tym poradzić?
Z góry dziękuje za pomoc.


Go to the top of the page
+Quote Post
Crozin
post 25.03.2011, 13:39:23
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


A po co Ci wyrażenia regularne tutaj w ogóle?
  1. WHERE LEFT(slowo, 1) = 'l' AND dlugosc_slowa = 4
Go to the top of the page
+Quote Post
molek
post 25.03.2011, 14:10:12
Post #3





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 25.03.2011

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


Fajny sposób ale co w przypadku kiedy chce wyszukać sześcioliterowe słowo gdzie wiem, że:
pierwsza litera to 'k' trzecia to 'a' i szósta to 'ć'
[k].[a]..[ć] (kłamać)
Go to the top of the page
+Quote Post
Crozin
post 25.03.2011, 14:48:35
Post #4





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Przy pomocy SUBSTRING() możesz wyciąć sobie pojedynczy znak z tekstu i go porównać (czyli w tym przypadku konieczne byłoby trzykrotne wykorzystanie tej funkcji). W dodatku funkcja ta jest multi-byte safe czyli nie będzie problemu z UTF-8.

Problemem REGEXP jest to:
Cytat
Warning

The REGEXP and RLIKE operators work in byte-wise fashion, so they are not multi-byte safe and may produce unexpected results with multi-byte character sets. In addition, these operators compare characters by their byte values and accented characters may not compare as equal even if a given collation treats them as equal.
Go to the top of the page
+Quote Post
kitol
post 29.03.2011, 09:57:23
Post #5





Grupa: Zarejestrowani
Postów: 162
Pomógł: 26
Dołączył: 19.01.2007

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


Spróbuj również:
  1. SELECT ... WHERE slowo LIKE 'k_a__ć'


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.05.2025 - 11:40