[PHP/RegExp]Problem z parsowaniem

[PHP/RegExp]Problem z parsowaniem
Loganek
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 8 lat
  • 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:ponad 21 lat
  • Ostatnio:ponad 2 lata
  • 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.


utf-8 rlz! ٩(ಥ_ಥ)۶
Loganek
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 8 lat
  • 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:około 19 lat
  • Ostatnio:ponad 13 lat
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.


You need to learn how to walk
before you can run
Loganek
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 8 lat
  • 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:ponad 21 lat
  • Ostatnio:ponad 2 lata
  • 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.


utf-8 rlz! ٩(ಥ_ಥ)۶
Loganek
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 8 lat
  • 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:około 19 lat
  • Ostatnio:ponad 13 lat
0

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


You need to learn how to walk
before you can run
Loganek
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 8 lat
  • 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.