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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
/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 :
  1. Rechercher les classes
  2. Garder le nom des classes
  3. Effacer le code des classes
  4. Recupérer la liste des fonctions qui ne sont pas dans une classe


Donc j'ai réussi à aboutir à l'expression suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
/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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
/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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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