Вот с чего начать:
$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
- это не самая первая вещь в строке.
Делая так, вы получаете возможность обрабатывать каждую строку по-своему, это упрощает работу и, что еще важнее, повышает точность сопоставления.