Newsgroup: it.comp.www.php
Titolo: [DIFFICILE] Identificare while e foreach

Puï¿œ sembrare facile, ma non credo lo sia.
Ho la necessitï¿œ di fare un unit test (o anche qualche
cosa di estremamente meno complesso) che mi identifichi
i file che contengono un comando, ad esempio "prova()"
all'interno di un foreach o di un while.
Con le espressioni regolari sembra quasi impossibile, perchï¿œ
dentro il foreach/while ci puï¿œ essere di tutto, compreso
altri foreach/while, pertanto non basterebbe usare una regexp
multiriga che identifichi le graffe.
Qualche idea?
Ad esempio, un codice di questo tipo, come potrei identificarlo?
foreach {
    if {
       switch {
          case "":
       }
       prova();
    }
}
bisogna identificare quale ï¿œ la graffa di chiusura associata al
foreach, il modo c'ï¿œ, perchï¿œ tutti gli IDE moderni riescono a
trovare le graffe corrispondenti, ma come si fa a fare un parser
simile? Va bene qualunque linguaggio di programmazione, meglio
se PHP, ovviamente.

 linguaggio di programmazione, meglio se PHP, ovviamente.
direi il buon vecchio: lettura seriale del file carattere per carattere!
si fa un bel ciclo sui caratteri, quando incontri una { poni una 
variabile ++, quando incontri una } fai --, quando sei a 0 hai trovato la 
chiusura :)
Ti ricordo che un le istruzioni dentro ad foreach possono anche non 
essere racchiuse tra graffe.
I casi sono: 
omissione delle graffe perchè si cicla su una sola istruzione
utilizzo del costrutto foreach/endforeach

 utilizzo del costrutto foreach/endforeach
Si lo so, ma nel mio caso ha poca importanza.
Devo identificare se qualche pirla ha richiamato una query
all'interno di un ciclo, in modo da decapitarlo, nel 99.99%
dei casi i while/foreach in questione sono molto lunghi, quelli
mono-riga sono un rischio che posso correre.
Ma per sapere se una determinata funzione viene richiamata da dentro
un foreach, devo poter 'estrapolare' il blocco di codice e poi
controllare al suo interno la presenza o meno della funzione.
Ma non so come estrarre il codice.
-- 
Non tocca a noi dominare tutte le maree del mondo,
il nostro compito è di fare il possibile per la
salvezza degli anni nei quali viviamo,
sradicando il male dai campi che conosciamo.

 non a qualche istruzione interna?
esattamente come ti ho detto io, ti posizioni all'apertura della graffa 
dopo il foreach e setti flag=1.
da li inizi se trovi un in ci sarà una aperuta (flag=2) ed una chiusura 
(flag=1) solo quando arrivi ad avere flag =0 sei alla chiusura della 
graffa del foreach.
nel frattempo i caratteri che scorri li metti in buffer e dopo fai un 
strpos di prova() nel buffer.
dopo ti posizioni al foreach/while successivo e riparti.


Con un po' di attenzione alle eventuali graffe messe tra virgolette, che 
farebbero parte di una stringa, e non del flusso di codice...

 strpos di prova() nel buffer.
Ottimo.
Mi basta salvare la posizione del foreach attualmente "selezionato" e
sommare il numero di caratteri che ci sono fino alla sua chiusura.
Così facendo dovrei ottenere un range, ad esempio 89-134, da usare in
substring per estrapolare il blocco che mi interessa.



vero, e anche a quelle messe nei commenti

semplice e geniale.
Ricorda anche di eliminare i commenti, prima. /* Potrebbero dare noia { */
Leonardo
-- 
The cock doth craw, the day doth daw,
the channerin' worm doth chide:
gin we be mist oot o' oor place,
a sair pain we maun bide.