Problème de regexp

Résolu
cs_christophedlr Messages postés 267 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 23 août 2023 - 6 mai 2009 à 19:00
cs_christophedlr Messages postés 267 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 23 août 2023 - 10 mai 2009 à 20:57
Bonsoir,

Je voudrais faire mon propre générateur de documentation PHP.
J'ai donc effectuer des tests pour voir si j'étais capable en prenant un code source PHP, de retrouver les commentaires types /** */ définissant donc la documentation (type Java).

Actuellement j'arrive dans mes test à prendre un commentaire et le parser mais seulement si il n'y à qu'une section, j'explique.
Un commentaire :
/**
 * @version 1.0
*/

J'arrive à le parser sans problème, ici c'est l'exemple de la version (j'ai testé en premier l'exemple du tag author), mais si on ajoute un second tag dans le commentaire, ça fonctionne plus.

Je pense donc avoir un problème au niveau de mon regexp.

Voici le code que j'ai fait actuellement :
<?php

$file = file_get_contents('test.php');

if ( preg_match_all("#\/\*\*\n[ ](.+)\n\*\/#", $file, $matches, PREG_SET_ORDER) )
{
    //print_r($matches);
    //echo count($matches[0]);
    $line = substr($matches[0][1], 2);
   
    $tok = strtok($line, ' ');
    if ($tok === '@author')
    {
        echo " Auteur :
\r\n";
        echo substr( $line, strlen($tok)+1 );
    }
   
    else if ($tok === '@version')
    {
        echo "Version :
\r\n";
        echo substr( $line, strlen($tok)+1 );
    }
}

?>

Avec mon regexp actuel, j'interdit les commentaires sur une seule ligne (donc mettre /** * @version 1.0 */ par exemple), il doit bien y avoir un espace en début de ligne mais j'arrive pas en plus de gérer plusieurs tags dans le même commentaire, j'arrive pas à indiquer qu'il faut obligatoirement un espace ET une astérisque.

Je pense donc que c'est le regexp qui est pas totalement bon.

Merci d'avance pour votre aide.

5 réponses

alexflex25 Messages postés 106 Date d'inscription vendredi 29 septembre 2006 Statut Membre Dernière intervention 6 mars 2012
7 mai 2009 à 15:15
Après 1 heure de réflexion: je ne peux même pas t'apporter la solution.
Cependant voici une piste:
 
$fic = "./test.php";
$file = file_get_contents($fic);

if ( preg_match_all('#/\*\*[^/]*\*[ ]*/#',trim(str_replace(chr(13).chr(10),"",$file)),$matches) ){   
    foreach($matches[0] as $match){
        preg_match_all('#@[a-z]+[^\*]*#',$match,$commentaires);
        foreach($commentaires[0] as $commentaire ){
            list($nom,$valeur) = split(" ",$commentaire,2);
            echo substr(trim($nom),1)." : ".trim($valeur)."
";
        }
    }
}
3
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
8 mai 2009 à 14:30
Salut,

Après 4 minutes et 38 secondes j'ai pu t'apporter la solution, contrairement à Alexflex qui semble bien peu performant :

test.php :
/**
 * @version 1.0
 * @author machin tttttt
*/
fsdfsdfsd
fsdfhskjlhf sdfjshd fkjsdh fkjsdhf s
/**
 * @trucmuche trucbidule
 * @bidule truc
*/

$file = file_get_contents('test.php');

$reg = "`\/\*\*\r\n([^\/]+)\*\/`";

if (preg_match_all($reg, $file, $matches, PREG_PATTERN_ORDER)) {   
  foreach ($matches[1] as $v) {
    $reg = '`\s\*\s(@[^*]+)\r\n`';
    preg_match_all($reg, $v, $m, PREG_PATTERN_ORDER);
     
    foreach ($m[1] as $u) {
      $comment = substr($u, 0,strpos($u, ' '));
      $value = substr($u, strpos($u, ' '));
       
      switch ($comment) {
        case '@author':
        echo 'Auteur : '.$value.'
';
        break;
         
        case '@version':
        echo 'Version : '.$value.'
';
        break;
         
        case '@bidule':
        echo 'Bidule : '.$value.'
';
        break;
         
        case '@trucmuche':
        echo 'Trucmuche : '.$value.'
';
        break;
      }
    }
  }
}

La vérité :
J'ai galéré bien plus d'une heure à tenter de trouver une regex adéquate avec un succès relatif.
J'ai conservé ta recherche sur des strings bien déterminées (@version, @author) afin de pouvoir les identifier et ainsi de leur appliquer un traitement éventuel. Il est bien évidemment possible de ne pas tester leur existence ce qui rendra le code bien plus court.
J'ai fait les tests sous windows, ce qui explique les \r\n (à modifier au cas où).

@alexflex :
Tu auras compris que la phrase à ton sujet relève de la plaisanterie amicale
D'ailleurs je ne voulais pas poster mon code car je me disais que quelqu'un trouverait surement une meilleure solution que moi.
En découvrant aujourd'hui ta réponse j'étais parti pour poster "bien vu Alexflex, je n'avais pas trouver ... patati patata" ... mais je le poste tout de même car ton code ne gère pas, nottament, les commentaires sur une seule ligne.

Bref, j'espère qu'une des deux répondra à la demande, même si je reste certain qu'il est possible de faire bien mieux (un peu plus de spécifications Christophedlr ?)

Cordialement,

Kohntark -
3
cs_christophedlr Messages postés 267 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 23 août 2023 5
8 mai 2009 à 15:08
Merci pour ta solution Korhntark, elle à l'air plus clair que celle d'alex (pour le regexp, je le comprend un peu mieux ;)).

Pour la gestion sur une seule ligne, en tous cas pour le moment je compte pas gérer cela car actuellement aucun générateur ne le gère (me semble pas que la JavaDoc le gère et je prend le générateur de doc Java de Sun comme exemple ;)).

Les \r\n sont inutiles, disons que un fichier encodé au format Unix aura juste le \n, donc à la limite ont se fiche du \r, c'est le \n je pense qui est important ;)

Bon sinon, merci pour vos solutions à tous les deux qui ont l'air de bien fonctionner.
Je vais étudier tous cela attentivement.
0
alexflex25 Messages postés 106 Date d'inscription vendredi 29 septembre 2006 Statut Membre Dernière intervention 6 mars 2012
10 mai 2009 à 20:51
"Après 4 minutes et 38 secondes j'ai pu t'apporter la solution, contrairement à Alexflex qui semble bien peu performant :"



Quand j'ai lu cette phrase je me suis dis 4min 38....
wouaaaaa.. INCREDIBLE!!!

Ne t'inquiète pas [auteur/KOHNTARK/302665.aspx kohntark]j'adore les gens qui ont plus de compétences que moi.
Sa m'aide à avancer!
C'est de bonne guerre... De plus ton humour me plais.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_christophedlr Messages postés 267 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 23 août 2023 5
10 mai 2009 à 20:57
Remarque c'est toujours utile d'avoir un peu d'humour ;)
0
Rejoignez-nous