2009-07-27 6 views
0

J'ai essayé de faire correspondre les commentaires PHP en utilisant regex.Regex Match PHP Commentaire

//([^<]+)\r\n 

C'est ce qui a été obtenu mais cela ne fonctionne pas vraiment.

Ive a également essayé

//([^<]+)\r 
//([^<]+)\n 
//([^<]+) 

... en vain

+2

Pourrait faire avec un peu plus d'informations sur ce que vous essayez d'atteindre, dans quelle langue vous correspondez * à *. – Draemon

Répondre

0

Vous avez probablement besoin d'échapper à la "//":

\/\/([^<]+) 
+0

Cependant, il ne correspond qu'à un seul commentaire. Il ne les trouvera pas tous dans le document –

+0

Vous n'avez pas demandé cela. Mais cela n'a aucun sens. Les regex ne s'appliquent qu'à une * ligne * (en général). Si vous passez chaque ligne à travers cette expression régulière, elle peut faire ce que vous voulez. Qu'est-ce que vous essayez réellement de faire si? – Draemon

1

Dans quel programme vous coder cette regex ? Votre dernier exemple est une bonne vérification d'intégrité si vous craignez que les caractères de nouvelle ligne ne fonctionnent pas. (Je ne sais pas pourquoi vous ne permettez pas moins que dans votre commentaire,. Je suppose que c'est spécifique à votre application)

Essayez

//[^<]+ 

et voir si cela fonctionne. Comme le dit Draemon, vous devrez peut-être échapper aux diagonales. Vous pourriez également devoir échapper aux parenthèses. Je ne sais pas si vous le savez, mais les parenthèses sont souvent utilisées pour saisir les groupes de capture . Enfin, vérifiez s'il existe bien au moins un caractère après les doubles barres obliques.

1

Pour correspondre des commentaires, vous devez penser il y a deux types de commentaires en PHP 5:

  • commentaires qui commencent par // et vont jusqu'à la fin de la ligne
  • commentaires qui commencent par /* et allez à */

Considérant que vous avez ces deux premières lignes:

$filePath = '/home/squale/developpement/astralblog/website/library/HTMLPurifier.php'; 
$str = file_get_contents($filePath); 

Vous pouvez faire correspondre les premiers avec:

$matches_slashslash = array(); 
if (preg_match_all('#//(.*)$#m', $str, $matches_slashslash)) { 
    var_dump($matches_slashslash[1]); 
} 

Et les seconds avec:

$matches_slashstar = array(); 
if (preg_match_all('#/\*(.*?)\*/#sm', $str, $matches_slashstar)) { 
    var_dump($matches_slashstar[1]); 
} 

Mais vous obtiendrez probablement dans des ennuis avec « // » au milieu de la chaîne (what about heredoc syntax, btw, did you think about that one ?), ou « basculer les commentaires » comme ceci:

/* 
echo 'a'; 
/*/ 
echo 'b'; 
//*/ 

(il suffit d'ajouter une barre oblique à l'être gining à « bascule » les deux blocs, si vous ne connaissez pas l'affaire)

Alors ... Tout à fait difficile de détecter des commentaires seulement ... regex


Une autre façon serait de utilisez le PHP Tokenizer, qui, évidemment, sait comment analyser le code PHP et les commentaires.

Pour les références, voir:

Avec cela, vous devez utiliser la tokenizer sur votre chaîne de code PHP, itérer sur tous les jetons que vous obtenez par conséquent, et détecter ceux qui sont des commentaires.

Quelque chose comme cela ferait sans doute:

$tokens = token_get_all($str); 

foreach ($tokens as $token) { 
    if ($token[0] == T_COMMENT 
     || $token[0] == T_DOC_COMMENT) { 
     // This is a comment ;-) 
     var_dump($token); 
    } 
} 

Et, en tant que sortie, vous obtiendrez une liste de choses comme ceci:

array 
    0 => int 366 
    1 => string '/** Version of HTML Purifier */' (length=31) 
    2 => int 57 

ou ceci:

array 
    0 => int 365 
    1 => string '// :TODO: make the config merge in, instead of replace 
' (length=55) 
    2 => int 117 

(Vous "juste" pourrait dépouiller le // et /* */, mais c'est dépend de vous ; au moins, vous avez extrait les commentaires ^^)

Si vous voulez vraiment détecter des commentaires sans aucune sorte d'erreur étrange en raison de la syntaxe « étrange », je suppose que ce serait la voie à suivre ;-)

0

Cela correspondra des commentaires en PHP (à la fois/* */et le format //)

/(\/\*).*?(\*\/)|(\/\/).*?(\n)/s 

pour tous les matches, utilisez preg_match_all pour obtenir tableau des correspondances.