Wyrażenie regularne odczytujące ciało funkcji

0

Witam,

chciałbym zrobić wyrażenie regularne, które znajdzie mi ciało funkcji:

/function\s+\w+(.)\W{(.*?)}/

ten regex złapie mi tylko to:

//odtad
function funkcja()
{
  if($cos==0)
  {
  //dotąd
  }
 
  //tego już nie złapie
  echo "tekst"

}

Jak zrobić żeby regex łapał wszystko do zamknięcia pierwszej klamry, tzn jak wykryć zamknięcie pierwszej klamry, czyli ostatni znak funkcji.

Nie umiem się "wysłowić"

0

Niby da się to zrobić, o ile regexy pozwalają na parowanie nawiasów (rekurencja / zliczanie). Tak jak teraz robisz, możesz jedynie złapać albo wszystko do pierwszego, albo ostatniego nawiasu. Najprościej nie używać do tego regexów, tylko przejechać pętlą po jednym znaku od pierwszego otwartego nawiasu i liczyć wszystkie nawiasy po drodze.

otwarteNawiasy = 1
i = poczatekCialaFunkcji
while (otwarteNawiasy > 0) {
    if (znak[i] == '}') {
        otwarteNawiasy--;
    } else if (znak[i] == '{') {
        otwarteNawiasy++;
    }
    i++;
}
koniecCialaFunkcji = i - 1

Ale tu dochodzą jeszcze nawiasy w stringach i komentarzach.

0

teraz mam dokładnie tak samo jak napisałeś, myślałem że lepiej regexpem to rozwiązać

0

Lepiej napisać parser, ja polecam generator parserów ANTLR. Ma wsparcie dla PHP oraz masz gotową gramatykę. Pozostaje ogarnąć jakiś tutorial dla ANTLR.

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