2010-05-03 5 views
1

J'ai un script qui scanne récursivement un répertoire en extrayant les noms de classe des fichiers php, et en stockant ces noms de classes dans un tableau. Cela fonctionne bien même à travers les dossiers de bibliothèque Zend Framework plutôt volumineux.Nom de la classe Preg_match du fichier PHP

Le problème est que les classes qui étendent d'autres classes ne sont pas incluses dans le tableau.

Voici mon preg_match actuel:

if (preg_match("/class\s*(\w*)\s*\{/i",strip_comments(file_get_contents($file)),$matches)) $classes[] = $matches[1]; 

Je sais que le dernier \ s * est pas juste; il devrait y avoir quelque chose qui peut attraper "{" ou "étend Some_Other_Class {".

Répondre

2

Essayez:

/^class ([a-zA-Z0-9_]+)/ 
+0

Pas exhaustive, mais devrait obtenir la plupart des sains. Voir la note ici: http://us2.php.net/manual/en/userlandnaming.php – cbednarski

+0

Ah, merci, j'ai essayé de le garder aussi simple que possible pour éviter les erreurs dans mon regex. –

+0

Notez que votre expression Regex ne retournera que le premier caractère du nom de la classe. – icio

0

Votre modèle doit simplement prendre le premier mot suivant le mot-clé class être le nom de la classe, par opposition à votre modèle actuel qui recherche un seul mot entre l'accolade de mot-clé class et l'ouverture { . Ceci est problématique lorsque votre classe en étend une autre car il n'y a pas qu'un seul mot entre les délimiteurs et donc le motif ne correspond pas.

est ici un modèle pour essayer:

/^\s*class\s+([a-zA-Z0-9_]+)/ 
+0

J'ai essayé cela, mais dans certains cas, le mot "class" apparaît dans un message envoyé à une exception levée. J'utilise le "{" pour m'assurer Im capturant le bon mot après "classe" – talentedmrjones

+0

Le nom de la classe ne sera pas la chaîne entière, mais le premier groupe. Pour y accéder, vous devrez appeler 'preg_match_all' pour obtenir les' $ matches ', puis les noms de classes de 'foreach ($ correspond à [1] sous $ className) echo $ className," \ n ";'. En outre, pourriez-vous fournir quelques cas de test et votre implémentation du code en cas d'autres problèmes? – icio

0

Je fini par utiliser ce fichier php foreach dans le chemin d'inclusion:

$handle = @fopen($path.'/'.$dir, "r"); 
        $stop=false; 
        if ($handle) 
        { 
         while (!$stop&&!feof($handle)) 
         { 
          $line = fgets($handle, 4096); 
          $matches=array(); 
          if (preg_match('#^(\s*)((?:(?:abstract|final|static)\s+)*)class\s+'.$input.'([-a-zA-Z0-9_]+)(?:\s+extends\s+([-a-zA-Z0-9_]+))?(?:\s+implements\s+([-a-zA-Z0-9_,\s]+))?#',$line,$matches)) 
          { 
           $stop=true; 
           $classes[]=$matches[3]; 
          } 
         } 
         fclose($handle); 
        } 

semble fonctionner assez bien. Trouvé dans un autre Coda Plugin qui fait quelque chose de similaire. Le seul hic est qu'il semble parfois pendre. Je ne sais pas si c'est un bug ou si c'est juste lent.

2
'/class[\s\n]+([a-zA-Z0-9_]+)[\s\na-zA-Z0-9_]+\{/' 

Celui-ci fonctionne mieux car il prend en charge les classes qui se prolongent ou mettent en œuvre.

Exemple:

class blah implements base 
{ 

correspondra.