![]() |
![]() ![]() |
![]() |
![]()
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 |
|
|
![]()
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
-------------------- |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 5 Pomógł: 0 Dołączył: 1.08.2007 Ostrzeżenie: (0%) ![]() ![]() |
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 |
|
|
![]()
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."
|
|
|
![]()
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! ![]() |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 27.06.2025 - 10:24 |