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


Я хочу проанализировать файл и хочу использовать php и регулярное выражение для удаления:

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

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

/* text */ 

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

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

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

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

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

Author: Alan Moore, 2009-03-13

8 answers

$text = preg_replace('!/\*.*?\*/!s', '', $text);
$text = preg_replace('/\n\s*\n/', "\n", $text);
 42
Author: chaos, 2009-03-13 15:05:22

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

print "/* a comment */";

В это:

print "";

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

 10
Author: Chris Lutz, 2009-03-13 15:11:01
//  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);
 4
Author: makaveli_lcf, 2013-10-02 12:15:40

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

 2
Author: soulmerge, 2009-03-13 15:12:48

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

$string = preg_replace('/(\s+)\/\*([^\/]*)\*\/(\s+)/s', "\n", $string);
 2
Author: St. John Johnson, 2009-03-13 15:28:10
$string = preg_replace('#/\*[^*]*\*+([^/][^*]*\*+)*/#', '', $string);
 2
Author: Federico Biccheddu, 2012-02-03 15:06:17

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

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

<?
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

 0
Author: Eduardo Cuomo, 2012-10-04 18:59:06