[PHP/RegExp]Problem z parsowaniem

[PHP/RegExp]Problem z parsowaniem
Loganek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 268
0

Witam, napisałem wyrażenie regularne, które wyciąga podciąg z danego ciągu.
Oto podciąg(plik template.php):
{IF x=3}czesc jesli jestes admiinem, widzisz {IF admin=1}to{/IF}{/IF} tekst{IF sadf=5}i tu kolejny if{/IF}
a to strona główna:

Kopiuj
<?php
$r=file_get_contents("template.php");
preg_match_all( "/\{IF (.*?)([>=<])(.*?)\}([^IF]*?)\{\/IF\}/s", $r, $tabif);
print_r($tabif);
?>

ak widać zadaniem kodu jest wyciągnięcie tekstu, który znajduje się pomiędzy znacznikami {IF}, pod warunkem że ten ciąg nie zawiera w sobie tekstu IF, dzięki czemu w tablicy powinny znaleźć się ciągi znaków które się nie zagnieżdżają.
Jednak tak nie jest, Co jest nie tak w wyrażeniu regularnym?
Z góry dziękuje za pomoc
Pozdrawiam

nav
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
0

[^IF] nie oznacza braku ciągu IF, a brak liter I, F. Nie może wystąpić ani jedna z nich.

Proponuję tu użyć negative lookahead, nie pamiętam dokładnie składni, ale imo to będzie rozwiązanie. Btw imo takie coś lepiej rozwiążesz stosem i ręcznym parsowaniem - obsłużysz wszystkie zagnieżdzenia w jednym przelocie przez tekst.

Loganek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 268
0

poczytam o negative lookahead, szczerze mówiąc to nie słyszałem o tym. A co rozumiesz przez stos i ręczne parsowanie?

johny_bravo
  • Rejestracja: dni
  • Ostatnio: dni
0

Stos i reczne parsowanie czyli szukasz {IF}, odkladasz jego pozycje na stos, przy {/IF} sciagasz ze stosu. Pierwszy sciagany ze stosu po serii odkladania jest najbardziej zagniezdzony.

Loganek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 268
0

rozważałem już wcześniej takie rozwiązanie, ale nie radziłem sobie z problemem gdy jest kilka ifów na jednym poziomie, a poza tym metoda jak dla mnie zbyt wolna;/

nav
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
0

To nic nie zmienia, tak samo jakby był jeden if. Po prostu po przejściu przez {if} i {/if} stos wyglada tak samo jak przed przejściem tego ifa.

Loganek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 268
0

ok,po południu coś popróbuje, jakby coś nie szło to dam znać, ale póki co to wielkie dzięki.

johny_bravo
  • Rejestracja: dni
  • Ostatnio: dni
0

Wolniejsze chyba nie jest, raczej szybsze, bo przypasowanie do wyrazenia jest bardziej skomplikowane niz proste wyszukanie znaku/ow.

Loganek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 268
0

ok, zrobiłem tak jak napisaliście(na stosie). 32 linijki kodu i funkcja parsuje jak trzeba;] Wielkie dzięki za pomysł zrobienia tego na stosie. Przy pętlach pewnie też z tego skorzystam.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.