2009-11-19 8 views
2

Je participe à l'un des concours Code Golf où plus la taille de votre fichier est petite, mieux c'est. Plutôt que de supprimer manuellement tous les espaces, etc., je recherche un programme ou un site Web qui prendra un fichier, supprimera tous les espaces (y compris les nouvelles lignes) et retournera une version compacte du fichier. Des idées?Le moyen le plus facile de supprimer tous les espaces d'un fichier de code?

+0

cela dépend de votre langue, mais 'sed' pourrait le faire, si vous voulez supprimer seulement l'espace – RageZ

+0

J'utilise PHP et en utilisant Windows pour le développement, je le veux pour supprimer whitepsace ainsi que les nouvelles lignes –

+1

Linux: fichier rm Windows: del fichier. Tous les espaces supprimés (certains autres caractères aussi, mais nulle part il est dit que vous devez les garder) –

Répondre

7

Vous pouvez utiliser:

sed 's/\s\s+/ /g' youfile > yourpackedfile` 

Il y a aussi this online tool.

Vous pouvez même le faire en PHP (comment merveilleux est la vie):

$data = file_get_contents('foobar.php'); 
$data = preg_replace('/\s\s+/', ' ', $data); 
file_put_contents('foobar2.php', $data); 

Vous devez noter que ce ne sera pas prendre soin d'une variable de chaîne comme $bar = ' asd aa a'; il pourrait être un problème en fonction de ce que vous faites. L'outil en ligne semble gérer cela correctement.

+0

Fabuleux, l'outil en ligne fonctionne très bien –

+0

@Click Upvote: génial! – RageZ

+0

Je préférerais '/ \ s {2,} /' sur ce que vous avez là. Je suis surpris qu'un mini-code PHP existe ... la plupart du temps il n'y a aucun intérêt; c'est côté serveur. – mpen

1

Dans PowerShell (v2) cela peut être fait avec le petit bout de code suivant:

(-join(gc my_file))-replace"\s" 

ou plus:

(-join (Get-Content my_file)) -replace "\s" 

Il se joindra à toutes les lignes ensemble et supprimer tous les espaces et les onglets.

Cependant, pour certaines langues, vous ne voulez probablement pas faire cela. Dans PowerShell par exemple, vous n'avez pas besoin des points-virgules, sauf si vous mettez plusieurs instructions sur une seule ligne de code comme si

while (1) { 
    "Hello World" 
    $x++ 
} 

deviendrait

while(1){"HelloWorld"$x++} 

lors de l'application des déclarations susmentionnées ingénument. Cela a changé la signification et la correction syntaxique du programme. Probablement pas trop à chercher dans les solutions golfiques numériques mais le problème avec les lignes réunies reste malheureusement, malheureusement. Le simple fait de placer un point-virgule entre chaque ligne n'aide pas non plus.

2
$ tr -d ' \n' <oldfile >newfile 
0

Si vos programmes éditeur de code prend en charge regular expressions, vous pouvez essayer ceci:

Find this: [\r\n]{2,} 
Replace with this: \n 
Then Replace All 
0

Notepad++ est un très bel éditeur si vous êtes sous Windows, et il a beaucoup de macros prédéfinies, coupe vers le bas code et en supprimant les espaces entre eux.

Il peut faire des expressions régulières et a une pléthore de fonctionnalités pour aider le code hacker ou script kiddie.

Notepad++ website

0

Run php -w sur elle! Contrairement à une expression régulière, elle est suffisamment intelligente pour laisser les chaînes seules et elle supprime également les commentaires.

0

C'est une fonction PHP qui fera le travail pour vous:

function compress_php_src($src) { 

    // Whitespaces left and right from this signs can be ignored 
    static $IW = array(
     T_CONCAT_EQUAL,    // .= 
     T_DOUBLE_ARROW,    // => 
     T_BOOLEAN_AND,    // && 
     T_BOOLEAN_OR,    // || 
     T_IS_EQUAL,     // == 
     T_IS_NOT_EQUAL,    // != or <> 
     T_IS_SMALLER_OR_EQUAL,  // <= 
     T_IS_GREATER_OR_EQUAL,  // >= 
     T_INC,      // ++ 
     T_DEC,      // -- 
     T_PLUS_EQUAL,    // += 
     T_MINUS_EQUAL,    // -= 
     T_MUL_EQUAL,    // *= 
     T_DIV_EQUAL,    // /= 
     T_IS_IDENTICAL,    // === 
     T_IS_NOT_IDENTICAL,   // !== 
     T_DOUBLE_COLON,    // :: 
     T_PAAMAYIM_NEKUDOTAYIM,  // :: 
     T_OBJECT_OPERATOR,   // -> 
     T_DOLLAR_OPEN_CURLY_BRACES, // ${ 
     T_AND_EQUAL,    // &= 
     T_MOD_EQUAL,    // %= 
     T_XOR_EQUAL,    // ^= 
     T_OR_EQUAL,     // |= 
     T_SL,      // << 
     T_SR,      // >> 
     T_SL_EQUAL,     // <<= 
     T_SR_EQUAL,     // >>= 
    ); 

    if(is_file($src)) { 
     if(!$src = file_get_contents($src)) { 
      return false; 
     } 
    } 

    $tokens = token_get_all($src); 

    $new = ""; 
    $c = sizeof($tokens); 
    $iw = false; // Ignore whitespace 
    $ih = false; // In HEREDOC 
    $ls = ""; // Last sign 
    $ot = null; // Open tag 
    for($i = 0; $i < $c; $i++) { 
     $token = $tokens[$i]; 

     if(is_array($token)) { 
      list($tn, $ts) = $token; // tokens: number, string, line 
      $tname = token_name($tn); 

      if($tn == T_INLINE_HTML) { 
       $new .= $ts; 
       $iw = false; 
      } 
      else { 
       if($tn == T_OPEN_TAG) { 

        if(strpos($ts, " ") || strpos($ts, "\n") || strpos($ts, "\t") || strpos($ts, "\r")) { 
         $ts = rtrim($ts); 
        } 

        $ts .= " "; 
        $new .= $ts; 
        $ot = T_OPEN_TAG; 
        $iw = true; 

       } elseif($tn == T_OPEN_TAG_WITH_ECHO) { 

        $new .= $ts; 
        $ot = T_OPEN_TAG_WITH_ECHO; 
        $iw = true; 

       } elseif($tn == T_CLOSE_TAG) { 

        if($ot == T_OPEN_TAG_WITH_ECHO) { 
         $new = rtrim($new, "; "); 
        } else { 
         $ts = " ".$ts; 
        } 
        $new .= $ts; 
        $ot = null; 
        $iw = false; 

       } elseif(in_array($tn, $IW)) { 

        $new .= $ts; 
        $iw = true; 

       } elseif($tn == T_CONSTANT_ENCAPSED_STRING 
         || $tn == T_ENCAPSED_AND_WHITESPACE) 
       { 

        if($ts[0] == '"') { 
         $ts = addcslashes($ts, "\n\t\r"); 
        } 
        $new .= $ts; 
        $iw = true; 

       } elseif($tn == T_WHITESPACE) { 

        $nt = @$tokens[$i+1]; 
        if(!$iw && (!is_string($nt) || $nt == '$') && !in_array($nt[0], $IW)) { 
         $new .= " "; 
        } 
        $iw = false; 

       } elseif($tn == T_START_HEREDOC) { 

        $new .= "<<<S\n"; 
        $iw = false; 
        $ih = true; // in HEREDOC 

       } elseif($tn == T_END_HEREDOC) { 

        $new .= "S;"; 
        $iw = true; 
        $ih = false; // in HEREDOC 
        for($j = $i+1; $j < $c; $j++) { 
         if(is_string($tokens[$j]) && $tokens[$j] == ";") { 
          $i = $j; 
          break; 
         } else if($tokens[$j][0] == T_CLOSE_TAG) { 
          break; 
         } 
        } 

       } elseif($tn == T_COMMENT || $tn == T_DOC_COMMENT) { 

        $iw = true; 

       } else { 

        if(!$ih) { 
         $ts = strtolower($ts); 
        } 
        $new .= $ts; 
        $iw = false; 
       } 
      } 
      $ls = ""; 

     } 
     else { 
      if(($token != ";" && $token != ":") || $ls != $token) { 
       $new .= $token; 
       $ls = $token; 
      } 
      $iw = true; 
     } 
    } 
    return $new; 
} 
// This is an example 
$src = file_get_contents('foobar.php'); 
file_put_contents('foobar3.php',compress_php_src($src)); 
Questions connexes