PDA

Visualizza la versione completa : [REGEX]Match nomi di metodi all'interno di file PHP se non sono dichiarazioni


codesurfer
18-06-2012, 10:45
Ciao a tutti,
avrei bisogno di una mano con le espressioni regolari.
Ho uno script che date una o più classi estrae i nomi dei vari metodi che contengono, e questo funziona.
Dati i nomi poi devo controllare se queste funzioni vengono utilizzate in un'app. Quindi devo sostanzialmente ciclare i vari files, leggerli (e qui ci siamo) e matchare i nomi dei vari metodi al loro interno.

I 3 casi in cui si possono presentare i nomi dei metodi sono:
1. dichiarazione: function Nome () {
2. commento: /* Method : Nome
3. utilizzo: $class->Nome ();

Vorrei fare in modo che il match escluda i primi due casi e consideri quindi sono i casi di utilizzo dei metodi (se è solo dichiarato o commentato lo segnalo come "non in uso").

Se po fa?

Grazie in anticipo ^^

Scara95
18-06-2012, 12:32
Basta che al posto di cercare per il nome del metodo cerchi per la sua applicazione:
->NomeMetodo ();

codesurfer
18-06-2012, 12:45
Ciao,
prima di tutto grazie della risposta :D
Quella era la soluzione "di riserva", se era fattibile preferivo farlo con un'espressione che facesse quello che descrivevo nel post di apertura. Anche perchè è possibile che in futuro alcuni metodi siano richiamati con "parent:: Nome();" e a quel punto "->Nome" non andrebbe più bene.
Potrei aggiungere ":: Nome" all'espressione ma comunque se c'era un modo per farlo da subito preferivo, sia perchè è più generale, sia perchè non si sa mai che sia un tipo di espressione che mi può tornare utile in altre occasioni.
Per ora sto usando comunque quello che suggerivi e ovviamente funziona ^^

Who am I
18-06-2012, 12:57
Per escludere i primi due casi, mentre fai il parsing cioè scandisci tutti i caratteri, basta utilizzare un booleano che setti a true ogni volta che incontri due caratteri "/*", e setti a false ogni volta che incontri due caratteri "*/".Lo puoi settare a true anche se incontri due caratteri "//" e in questo caso lo setti a false quando si va a capo riga.Se questo booleano è uguale a true il nome non viene considerato.
Cosi' hai eliminato il primo caso.
Per eliminare il secondo caso basta verificare che il nome della funzione sia seguito da un punto e virgola anzichè da una graffa.

codesurfer
18-06-2012, 14:41
Ciao,
grazie anche a te della risposta.
Non c'è una fase di parsing, utilizzo preg_match_all quindi non scorro la stringa per caratteri (sempre che io abbia inteso bene la tua frase).
Per invece la seconda parte se alcuni metodi ritornano un dato già formattato spesso sono utilizzate direttamente in espressioni o nell'output (ad esempio if ( !empty ( $class->Nome () ) )) quindi non c'è sempre il ; finale. Anche qui si potrebbe risolvere assegnando il valore ad una variabile e poi usando quella ma non è il massimo.

Who am I
18-06-2012, 15:22
A questo punto ti conviene fare come ha detto Scara95, aggiungendo il caso nomeclasse.metodo() .
Se mai dopo le cose dovessero cambiare potrai aggiungere un pattern nomeclasse::metodo() .

Loading