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

Я хочу проанализировать файл, и я хочу использовать php и regex для разметки:

  • пустые или пустые строки
  • однострочные комментарии
  • многострочные комментарии

в основном я хочу удалить любую строку, содержащую

/* text */ 

или многострочные комментарии

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

Если возможно, другое регулярное выражение, чтобы проверить, пустует ли строка (Удалить пустые строки)

Это возможно? может ли кто-нибудь отправить мне регулярное выражение, которое делает именно это?

Большое спасибо.

Related of "Регулярное выражение для комментариев и многострочных комментариев и пустых строк"

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

Имейте в виду, что любое используемое вами регулярное выражение не будет выполнено, если в файле, который вы обрабатываете, есть строка, содержащая что-то, что соответствует этим условиям. Например, это изменит это:

 print "/* a comment */"; 

В этом:

 print ""; 

Скорее всего, это не то, что вы хотите. Но может быть, я не знаю. Во всяком случае, регулярные выражения технически не могут анализировать данные таким образом, чтобы избежать этой проблемы. Я говорю технически, потому что современные регулярные выражения PCRE прикрепили к ряду хаков, чтобы сделать их обоих способными сделать это и, что более важно, уже не регулярные выражения, а что угодно. Если вы хотите избежать снятия этих вещей внутри кавычек или в других ситуациях, нет никакой замены полноразмерному парсеру (хотя он все равно может быть довольно простым).

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

Это возможно, но я бы этого не сделал. Вам нужно разобрать весь файл php, чтобы убедиться, что вы не удаляете никаких необходимых пробелов (строки, пробелы с ключевыми словами / идентификаторами (publicfuntiondoStuff ()) и т. Д.). Лучше использовать расширение токенизатора PHP.

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

Это должно работать при замене всех / * на * /.

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

Это мое решение, если оно не используется для регулярного выражения. Следующий код удаляет весь комментарий, разделенный символом #, и извлекает значения переменной в этом стиле 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); } 

Это хорошая функция, и РАБОТАЕТ!

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

Теперь, используя эту функцию 'strip_comments' для передачи кода, содержащегося в некоторой переменной:

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

Вывести результат как

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

Загрузка из файла php:

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

Загрузка php-файла, удаление комментариев и сохранение их обратно

 <? $file = "some_code_file.php" $code = file_get_contents($file); $code = strip_comments($code); $f = fopen($file,"w"); fwrite($f,$code); fclose($f); ?> 

Источник: http://www.php.net/manual/en/tokenizer.examples.php