Сценарий оболочки или команда для удаления всего текста между начальным и конечным символами во всем каталоге - PullRequest
0 голосов
/ 12 сентября 2018

В поисках простого способа удалить все мои TODO: комментарии по всему каталогу скриптов.

Если у меня есть:

/*
TODO: Some text here
Some more Here
Some more Here
*/

Я хочу удалить / * ВсеМежду и * / Не так уж много, просто интересно уменьшить размер файла

1 Ответ

0 голосов
/ 12 сентября 2018

Вот с чего начать:

$file = 'somefile.php';

$f = fopen($file,'r');
$temp = dirname($file).'/temp.php';
print_r($temp);
$t = fopen($temp, 'w');

$mode = 'write';
$buffer = [];
while($line=fgets($f)){
    print_r($mode."\n");
    switch($mode){
        case 'write':
            if(preg_match('/^\s*\/\\*/', $line)){
                $buffer[] = $line;
                $mode = 'comment';
            }else{
                fputs($t,$line);
            }
        break;
        case 'comment': 
            if(preg_match('/^\s*\\**\s*@TODO/i', $line)){
                $buffer = [];
                $mode = 'skip';
            }else if(preg_match('/^\s*\\*\//', $line)){
                fwrite($t,implode("", $buffer));
                $buffer = [];
                fputs($t,$line);
                $mode = 'write';
            }else{
                $buffer[] = $line;
            }
        break;
        case 'skip':
            if(preg_match('/^\s*\\*\//', $line)){
                $mode = 'write';
            }
        break;
    }
}
/*
fclose($t);
fclose($f);
rename($temp, $file);
*/

Я проверил это против этого файла

<?php
$var= "foo";

/*
 @todo hello
 some other shuff
 */



/**
 * 
 * @author Me
 *
 */
class someclass{



}

Это был материал в temp.php

<?php
$var= "foo";




/**
 * 
 * @author Me
 *
 */
class someclass{



}

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

ОБНОВЛЕНИЕ

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

Регулярное выражение используется только для учета пробелов или комментариев, подобных этому

/*
* @todo
*/

Этот \\* становится \* для механизма регулярных выражений, который затем становится буквальным *

Так вот этот \s*\/\\*

  • \s* - пробелов нет или больше
  • \/ - / буквально
  • \\* - * буквально

Или по-английски /* открытый тег комментария.

Я упоминаю об этом, потому что регулярное выражение является хитрым, но у вас, вероятно, есть пробелы и другие вещи, вероятно, каждый @todo - это не самая первая вещь в строке.

Делая так, вы получаете возможность обрабатывать каждую строку по-своему, это упрощает работу и, что еще важнее, повышает точность сопоставления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...