Salut à tous.
Après plusieurs heures de tâtonnements et de recherches, je me résigne a publier ma question sur un forum.
voilà, je vous expose ce que je veux faire et ce que j'ai fait.
je veux pouvoir lire un fichier php et en faire la liste des fonctions et de classe.
dans un premier temps j'ai fait une recherche sur les fonctions avec l'expression suivante :
/function\s{1,}([0-9A-Za-z_\-]+)\s{0,}\(/
elle fonctionne très bien.
toutefois, la déclarations de méthodes dans un classe se crée de la même manière ce qui fait que je ne sais pas si ma fonction appartient a une classe ou non, et c'est très important de le savoir.
je suis donc parti sur l'idée suivante :
- Rechercher les classes
- Garder le nom des classes
- Effacer le code des classes
- Recupérer la liste des fonctions qui ne sont pas dans une classe
Donc j'ai réussi à aboutir à l'expression suivante:
/class\s*([0-9A-Za-z_\-]*)\s*(?:extends\s*[0-9A-Za-z_\-]*)?\s*/
qui me retourne la liste des classes:
maintenant il me fallait aussi recupérer ce qu'il y a entre "{" et "}" pour pouvoir l'effacer et ne pas affecter la suite de la recherche.
j'ai donc le code suivant pour trouver les accolades
maintenant, mon problème, c'est que je dois joindre ces deux expressions pour pouvoir matcher les accolades quand elles appartiennent a une classe
ce qui donnerait :
/class\s*([0-9A-Za-z_\-]*)\s*(?:extends\s*[0-9A-Za-z_\-]*)?\s*\{([^{}]+|(?R))*\}/
le problème c'est que preg_match_all ne retourne absolument rien.
pourtant, si on enlève juste "class" de la recherche, elle fonctionne a nouveau.
mais si on utilise comme chaine de test :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| class na_m-e {
$blabla = \'\';
function name(){
if($id2=="24"){
}
}
}
class na_m-e2 extends the_OtherCla-ss24{
$blabla = \'\';
function name(){
if($id == 2){
}
}
}
if(){
function name(){
}
} |
Dans le cas du pattern simplifié, ca matche aussi la fonction "name" entre les accolades du "if()"
si quelqu'un a une solution a mon problème ou une idée alternative, je suis preneur
Partager