Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> preg_match_all() a polskie znaki
zurek
post 25.03.2009, 16:53:09
Post #1





Grupa: Zarejestrowani
Postów: 88
Pomógł: 0
Dołączył: 4.09.2007
Skąd: Kraków

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


Napisałem małego boota, który włazi narazie na jedną stronę i pobiera dane głównie przy pomocy preg_match_all(). Wszystko działa, informacje są zapisywane do bazy danych tylko niestety bez polskich znaków. Pojaiają się znane krzaczki, kwadraciki itp.. Strona, z której ściągam dane ma kodowaie UTF-8. Zmieniłem kodowanie plików boota, próbowałem z iconv i ze zmianami w ustawieniach DB, ale nic to nie dawało. Wszystko dalej tak samo. Szukałem na forum, znalazłem kilka wątków, ale żedane nie do końca moze mi pomóc. Z góry dziękuję wszystkim za jakąkolwiek pomoc i cierpliwość.
Go to the top of the page
+Quote Post
230005
post 25.03.2009, 17:37:23
Post #2





Grupa: Zarejestrowani
Postów: 316
Pomógł: 36
Dołączył: 2.04.2008

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


Zdaje mi się, że jeśli chcesz używać polskich znaków w wyrażeniach regularnych, to powinieneś używać funkcji z przedrostkiem mb_ .
Go to the top of the page
+Quote Post
erix
post 25.03.2009, 17:52:43
Post #3





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




Aby preg_ działał z wielobajtowymi zestawami znaków, dodaj flagę /u do wzorca.

PS. Zakresy a-z, czy pochodne nie zawierają polskich diakrytyków.


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

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
zurek
post 25.03.2009, 19:22:07
Post #4





Grupa: Zarejestrowani
Postów: 88
Pomógł: 0
Dołączył: 4.09.2007
Skąd: Kraków

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


Wszystko w porządku. Teraz wyszukuje ciągi razem z polskimi znakami, ale źle dodaje do bazy. Nie wiem kompletnie dlaczego. Zmieniłem metodę porównywania napisów na utf8_polish_ci i nic. Co przeoczyłem?

Ten post edytował zurek 25.03.2009, 19:22:30
Go to the top of the page
+Quote Post
erix
post 25.03.2009, 19:26:50
Post #5





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




A wklep mysql kodowanie w szukajkę, to znajdziesz mnóstwo tematów. winksmiley.jpg


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

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
zurek
post 25.03.2009, 20:00:53
Post #6





Grupa: Zarejestrowani
Postów: 88
Pomógł: 0
Dołączył: 4.09.2007
Skąd: Kraków

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


Dziękuję ci bardzo erix. Wystarczyło dodać przy dodawaniu rekordów do bazy danych:

  1. <?php
  2. $result = mysql_query("SET CHARACTER utf8");
  3. $result = mysql_query("SET NAMES utf8");
  4. $result = mysql_query("SET CHARACTER_SET utf8");
  5. ?>


I dokładnie pozmieniać kodowania w pliku boota i w ustawieniach bazy.
Go to the top of the page
+Quote Post
Krisu
post 9.06.2009, 19:05:06
Post #7





Grupa: Zarejestrowani
Postów: 211
Pomógł: 0
Dołączył: 30.03.2006
Skąd: Żary

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


Cytat(erix @ 25.03.2009, 18:52:43 ) *
Aby preg_ działał z wielobajtowymi zestawami znaków, dodaj flagę /u do wzorca.

PS. Zakresy a-z, czy pochodne nie zawierają polskich diakrytyków.


Dodałem flagę u/ do wzorca, jednak funkcja preg_match_all nadal nie czyta polskich znaków. W jaki sposób je objąć, jeżeli nie przez zakres [a-z]?
Go to the top of the page
+Quote Post
erix
post 9.06.2009, 19:17:50
Post #8





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




Cytat
Dodałem flagę u/ do wzorca

Nie tak ta flaga wygląda. ;] Pokaż cały wzorzec.

Cytat
W jaki sposób je objąć, jeżeli nie przez zakres [a-z]?

Wpisać do klasy znaków po kolei. [a-z] nie zawiera znaków narodowych. Co by było z np. rosyjskim? snitch.gif


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

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
Krisu
post 9.06.2009, 19:24:20
Post #9





Grupa: Zarejestrowani
Postów: 211
Pomógł: 0
Dołączył: 30.03.2006
Skąd: Żary

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


  1. <?php
  2. preg_match_all('/([w]+)/u', 'struś pędziwiatr', $matches);
  3. ?>


Sprawdzam przez:
  1. <?php
  2. echo '<pre>';
  3. print_r($matches);
  4. echo '</pre>'
  5. ?>


Otrzymuję:
Kod
Array
<pre>(
     [0] => Array
         (
             [0] => stru
             [1] => p
             [2] => dziwiatr
         )

     [1] => Array
         (
             [0] => stru
             [1] => p
             [2] => dziwiatr
         )

)


Ten post edytował Krisu 9.06.2009, 19:26:45
Go to the top of the page
+Quote Post
erix
post 9.06.2009, 19:30:32
Post #10





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




W jakim kodowaniu masz zapisany skrypt?


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

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
Krisu
post 9.06.2009, 19:31:43
Post #11





Grupa: Zarejestrowani
Postów: 211
Pomógł: 0
Dołączył: 30.03.2006
Skąd: Żary

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


Kodowanie pliku w UTF-8 oraz dokumentu html:

Kod
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
<head>
   <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
</head>


Ten post edytował Krisu 9.06.2009, 19:38:13
Go to the top of the page
+Quote Post
wookieb
post 9.06.2009, 19:59:04
Post #12





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




ani \w ani [a-zA-z] nie pobierzesz polskich znakow. Musisz je dopisac w wyrazeniu regularnym albo zastosowac http://php.net/mb_ereg


--------------------
Go to the top of the page
+Quote Post
Krisu
post 9.06.2009, 20:09:32
Post #13





Grupa: Zarejestrowani
Postów: 211
Pomógł: 0
Dołączył: 30.03.2006
Skąd: Żary

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


Jednak mb_ereg działa tylko jak preg_match, a nie znajdę odpowiednika preg_match_all, pośród funkcji MB? Nie ma żadnego innego sposobu by to obejść?
Go to the top of the page
+Quote Post
wookieb
post 9.06.2009, 20:15:13
Post #14





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Cytat(Krisu @ 9.06.2009, 21:09:32 ) *
a nie znajdę odpowiednika preg_match_all, pośród funkcji MB?

A czy manual php powiedział do ciebie kiedyś "sp....... nie chcę cię tu widzieć"? Szukaj http://pl2.php.net/manual/pl/ref.mbstring.php


--------------------
Go to the top of the page
+Quote Post
Krisu
post 9.06.2009, 20:48:31
Post #15





Grupa: Zarejestrowani
Postów: 211
Pomógł: 0
Dołączył: 30.03.2006
Skąd: Żary

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


niestety, ale nie widzę odpowiednika funkcji preg_match_all na tej liście, którą mi podałeś. Źle szukam, czy rzeczywiście takiego nie ma? smile.gif
Go to the top of the page
+Quote Post
wookieb
post 9.06.2009, 21:01:06
Post #16





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Ech...
  1. <?php
  2. $tekst='hea heo hem hem hem';
  3.  
  4. mb_ereg_search_init($tekst, 'e[a-z]{1}');
  5.  
  6. var_dump(mb_ereg_search_getregs());<tr></tr>
  7. $matches=array();
  8. while($wyn=mb_ereg_search_regs())
  9. {
  10.    $matches[]=$wyn;
  11. }
  12.  
  13. print_r($matches);
  14. ?>


Przypomnę, żeby korzystac z mb_eregi w ostatecznosci. Jezeli chodzi ci tylko o polskie znaki to juz mozna sie przemeczyc z preg_match_all

Ten post edytował wookieb 9.06.2009, 21:01:53


--------------------
Go to the top of the page
+Quote Post
Krisu
post 9.06.2009, 21:12:03
Post #17





Grupa: Zarejestrowani
Postów: 211
Pomógł: 0
Dołączył: 30.03.2006
Skąd: Żary

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


Ok, dzięki za pomoc, jednak nie tylko do polskich znaków tego potrzebuję, ale również zagranicznych, dlatego nie chciałem używać preg_match_all.
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:28