Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: preg_match_all() a polskie znaki
Forum PHP.pl > Forum > PHP
zurek
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ść.
230005
Zdaje mi się, że jeśli chcesz używać polskich znaków w wyrażeniach regularnych, to powinieneś używać funkcji z przedrostkiem mb_ .
erix
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.
zurek
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?
erix
A wklep mysql kodowanie w szukajkę, to znajdziesz mnóstwo tematów. winksmiley.jpg
zurek
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.
Krisu
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]?
erix
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
Krisu
  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
         )

)
erix
W jakim kodowaniu masz zapisany skrypt?
Krisu
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>
wookieb
ani \w ani [a-zA-z] nie pobierzesz polskich znakow. Musisz je dopisac w wyrazeniu regularnym albo zastosowac http://php.net/mb_ereg
Krisu
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ść?
wookieb
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
Krisu
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
wookieb
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
Krisu
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.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.