Regex pour supprimer les commentaires et les commentaires multi-lignes et les lignes vides

StackOverflow https://stackoverflow.com/questions/643113

  •  22-07-2019
  •  | 
  •  

Question

Je veux analyser un fichier et utiliser php et regex pour supprimer:

  • lignes vides ou vides
  • commentaires sur une ligne
  • commentaires multi-lignes

fondamentalement, je veux supprimer toute ligne contenant

/* text */ 

ou commentaires multi-lignes

/***
some
text
*****/

Si possible, une autre expression rationnelle pour vérifier si la ligne est vide (Supprimez les lignes vides)

Est-ce possible? quelqu'un peut-il poster sur moi une regex qui ne fait que ça?

Merci beaucoup.

Était-ce utile?

La solution

$text = preg_replace('!/\*.*?\*/!s', '', $text);
$text = preg_replace('/\n\s*\n/', "\n", $text);

Autres conseils

N'oubliez pas que toute expression rationnelle que vous utilisez échouera si le fichier que vous analysez contient une chaîne contenant quelque chose qui correspond à ces conditions. Par exemple, cela transformerait ceci:

print "/* a comment */";

Dans ceci:

print "";

Ce qui n'est probablement pas ce que vous souhaitez. Mais peut-être que oui, je ne sais pas. Quoi qu'il en soit, les expressions rationnelles ne peuvent techniquement pas analyser les données de manière à éviter ce problème. Je dis techniquement parce que les expressions rationnelles PCRE modernes ont misé sur un certain nombre de hacks pour les rendre capables de le faire et, plus important encore, d’expressions plus normaux , mais peu importe. Si vous souhaitez éviter de mettre ces éléments entre guillemets ou dans d’autres situations, rien ne remplace un analyseur syntaxique complet (bien que cela puisse quand même être assez simple).

//  Removes multi-line comments and does not create
//  a blank line, also treats white spaces/tabs 
$text = preg_replace('!^[ \t]*/\*.*?\*/[ \t]*[\r\n]!s', '', $text);

//  Removes single line '//' comments, treats blank characters
$text = preg_replace('![ \t]*//.*[ \t]*[\r\n]!', '', $text);

//  Strip blank lines
$text = preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $text);

Cela est possible, mais je ne le ferais pas. Vous devez analyser le fichier php en entier pour vous assurer de ne pas supprimer les espaces blancs nécessaires (chaînes, espaces entre mots-clés / identifiants (publicfuntiondoStuff ()), etc.). Mieux vaut utiliser l'extension tokenizer de PHP.

Cela devrait fonctionner pour remplacer tout / * par * /.

$string = preg_replace('/(\s+)\/\*([^\/]*)\*\/(\s+)/s', "\n", $string);
$string = preg_replace('#/\*[^*]*\*+([^/][^*]*\*+)*/#', '', $string);

C'est ma solution, si on n'est pas habitué à regexp. Le code suivant supprime tous les commentaires délimités par # et récupère les valeurs de variable dans ce style NAME = VALUE

  $reg = array();
  $handle = @fopen("/etc/chilli/config", "r");
  if ($handle) {
   while (($buffer = fgets($handle, 4096)) !== false) {
    $start = strpos($buffer,"#") ;
    $end   = strpos($buffer,"\n");
     // echo $start.",".$end;
       // echo $buffer ."<br>";



     if ($start !== false)

        $res = substr($buffer,0,$start);
    else
        $res = $buffer; 
        $a = explode("=",$res);

        if (count($a)>0)
        {
            if (count($a) == 1 && !empty($a[0]) && trim($a[0])!="")
                $reg[ $a[0] ] = "";
            else
            {
                if (!empty($a[0]) && trim($a[0])!="")
                    $reg[ $a[0] ] = $a[1];
            }
        }




    }

    if (!feof($handle)) {
        echo "Error: unexpected fgets() fail\n";
    }
    fclose($handle);
}

C’est une bonne fonction et WORKS!

<?
if (!defined('T_ML_COMMENT')) {
   define('T_ML_COMMENT', T_COMMENT);
} else {
   define('T_DOC_COMMENT', T_ML_COMMENT);
}
function strip_comments($source) {
    $tokens = token_get_all($source);
    $ret = "";
    foreach ($tokens as $token) {
       if (is_string($token)) {
          $ret.= $token;
       } else {
          list($id, $text) = $token;

          switch ($id) { 
             case T_COMMENT: 
             case T_ML_COMMENT: // we've defined this
             case T_DOC_COMMENT: // and this
                break;

             default:
                $ret.= $text;
                break;
          }
       }
    }    
    return trim(str_replace(array('<?','?>'),array('',''),$ret));
}
?>

Maintenant, en utilisant cette fonction 'strip_comments' pour passer le code contenu dans une variable:

<?
$code = "
<?php 
    /* this is comment */
   // this is also a comment
   # me too, am also comment
   echo "And I am some code...";
?>";

$code = strip_comments($code);

echo htmlspecialchars($code);
?>

La sortie sera comme

<?
echo "And I am some code...";
?>

Chargement depuis un fichier php:

<?
$code = file_get_contents("some_code_file.php");
$code = strip_comments($code);

echo htmlspecialchars($code);
?>

Charger un fichier php, supprimer les commentaires et le sauvegarder

<?
$file = "some_code_file.php"
$code = file_get_contents($file);
$code = strip_comments($code);

$f = fopen($file,"w");
fwrite($f,$code);
fclose($f);
?>

Source: http://www.php.net/manual/en/ tokenizer.examples.php

J'ai trouvé celui-ci qui me convenait mieux, (\ s +) \ / \ * ([^ \ /] *) \ * / \ n * il supprime les multi-lignes, les tabulations ou non les commentaires et l’espace derrière. Je vais laisser un exemple de commentaire auquel cette expression rationnelle correspondrait.

/**
 * The AdditionalCategory
 * Meta informations extracted from the WSDL
 * - minOccurs : 0
 * - nillable : true
 * @var TestStructAdditionalCategorizationExternalIntegrationCUDListDataContract
 */
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top