[PHP/RegExp]Problem z parsowaniem

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:

<?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

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.

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?

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.

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;/

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.

0

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

0

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

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1