Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php] preg_match i parsowanie arraya
dreamcatch
post 1.08.2007, 08:21:11
Post #1





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 1.08.2007

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


Witam,

Próbuje sparsować tekst z php z tablicami.

w stringach jest:


Kod
$SERVICE_LANG['IMP']['err_kraj']   =   'Wybierz kraj';


ale może być tez tablica więcej niż 2 wymiarowa i tych ma NIE dopasowywać.

Kod
$SERVICE_LANG['IMP']['err_kraj']['w'] =   'Wybierz kraj';


Regexp jest taki:

Kod
\$SERVICE_LANG\s*\[([\'\"])(.*?)\1\]\s*\[([\"\'])(.*?)\3\]\s*=\s*([\"\'])(.*)\5\s*;


I w perlu działa bardzo dobrze. Natomiast w PHP w funkcji preg_match nie bardzo.
Poniższy kod:


Kod
if( preg_match('/\$SERVICE_LANG\s*\[([\'\"])(.*?)\1\]\s*\[([\"\'])(.*?)\3\]\s*=\s*([\"\'])(.*)\5\s*;/',$line,$matches) )
{
        print "<pre>";print_r($matches);"</pre>";
}

Zwraca taka tablice.
Kod
Array
(
    [0] => $SERVICE_LANG['IMPREZY']['err_kraj']['w']='Wybierz kraj';
    [1] => '
    [2] => IMPREZY
    [3] => '
    [4] => err_kraj']['w
    [5] => '
    [6] => Wybierz kraj
)


czyli mimo, że jest dopasowanie .*? minimalistyczne i tak dopasowuje źle.

Ten post edytował dreamcatch 1.08.2007, 10:00:33
Go to the top of the page
+Quote Post
sticker
post 1.08.2007, 09:54:01
Post #2





Grupa: Zarejestrowani
Postów: 611
Pomógł: 19
Dołączył: 28.02.2005
Skąd: Wrocław

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


szkoda że nie pokolorowałeś składnie i nie napisałeś co chcesz mieć na wyjściu


--------------------
Go to the top of the page
+Quote Post
dreamcatch
post 1.08.2007, 10:03:18
Post #3





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 1.08.2007

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


Cytat(sticker @ 1.08.2007, 10:54:01 ) *
szkoda że nie pokolorowałeś składnie i nie napisałeś co chcesz mieć na wyjściu


Poprawiłem.
Tagi php usuwaja escapowanie wiec dalej je w kod.

Na wyjściu chcę mieć stringi między znakami "" '' z tablicy i z wartości przypisanych do tablic.

Jak napisałem wszystko działa jeśli tablica jest 2 wymiarowa, przy tablicy 3 wymiarowej i więcej nie działa
poprawnie. Regexp powinien w ogóle nie 'matchować' takich stringów.

Ten post edytował dreamcatch 1.08.2007, 10:03:50
Go to the top of the page
+Quote Post
Kicok
post 1.08.2007, 11:51:28
Post #4





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

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


Cytat
Regexp powinien w ogóle nie 'matchować' takich stringów.

A to niby dlaczego?

Wyrażenie najpierw spróbuje dopasować do pierwszego (.*?): `IMPREZY`, a do drugiego: `err_kraj`, tyle że dalsza część wyrażenia nie będzie wtedy pasowała do `['w']='Wybierz kraj';`
W związku z tym mechanizm wyrażeń cofnie się do ostatnio dopasowanego fragmentu i spróbuje dopasować do (.*?) trochę więcej znaków. Teraz do pierwszego (.*?) zostało dopasowane: `IMPREZY`, a do drugiego: `err_kraj']['w`. Dalsza część wyrażenia pasuje do tekstu, więc mechanizm wyrażeń zwraca ci wynik dopasowania z przeświadczeniem, że o to Ci właśnie chodziło.
Kolejna próba to dla pierwszego: `IMPREZY`, a dla drugiego: `err_kraj'][`, ale `


Do dopasowania jednego nawiasu kwadratowego użyj:
Kod
\\[(\'[^\']*\'|"[^"]*")\\]


Oczywiście wyłapie ci to nazwy kluczy razem z apostrofami/cudzysłowem, więc będziesz musiał jeszcze użyć:
Kod
$zmienna = substr( $zmienna, 1, -1 );


--------------------
"Sumienie mam czyste, bo nieużywane."
Go to the top of the page
+Quote Post
dreamcatch
post 1.08.2007, 13:19:30
Post #5





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 1.08.2007

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


Dzięki wielkie za pomoc.

Pozdrawiam serdecznie! smile.gif
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: 27.06.2025 - 10:24