Самый простой способ удалить все пробелы из файла кода?

Я участвую в одном из соревнований Code Golf, где, чем меньше размер вашего файла, тем лучше.

Вместо того, чтобы вручную удалять все пробелы и т. Д., Я ищу программу или веб-сайт, который возьмет файл, удалит все пробелы (включая новые строки) и вернет компактную версию файла. Есть идеи?

Вы можете использовать:

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

Существует также этот онлайн-инструмент .

Вы даже можете сделать это на PHP (как чудесно жизнь):

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

Вы должны отметить, что это не позаботится о строковой переменной, как $bar = ' asd aa a'; это может быть проблемой в зависимости от того, что вы делаете. Кажется, что он работает правильно.

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

В PowerShell (v2) это можно сделать со следующим небольшим фрагментом:

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

или дольше:

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

Он объединит все строки и удалит все пробелы и вкладки.

Однако для некоторых языков вы, вероятно, не хотите этого делать. Например, в PowerShell вам не нужны точки с запятой, если вы не ставите несколько операторов на одну строку, поэтому код

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

станет

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

при наивысшем применении вышеупомянутых утверждений. Он изменил значение и синтаксическую правильность программы. Вероятно, не слишком много, чтобы искать в численных решениях для игры в гольф, но проблема с соединенными линиями все еще остается, к сожалению. Простое использование точки с запятой между каждой строкой не помогает.

Если ваши программы редактирования кода поддерживают регулярные выражения , вы можете попробовать следующее:

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

Notepad ++ – неплохой редактор, если вы в Windows, и у него много предопределенных макросов, обрезка кода и удаление пробелов среди них.

Он может выполнять регулярные выражения и обладает множеством функций, помогающих хакерам кода или скрипту kiddie.

Сайт Notepad ++

Запустите php -w на нем!

 php -w myfile.php 

В отличие от регулярного выражения, это достаточно умен, чтобы оставить строки в одиночку, а также удаляет комментарии.

Это функция PHP, которая будет работать для вас:

 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));