Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] preg_match i parsowanie arraya
Forum PHP.pl > Forum > PHP
dreamcatch
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.
sticker
szkoda że nie pokolorowałeś składnie i nie napisałeś co chcesz mieć na wyjściu
dreamcatch
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.
Kicok
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 );
dreamcatch
Dzięki wielkie za pomoc.

Pozdrawiam serdecznie! smile.gif
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.