it-roy-ru.com

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

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

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

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

/* text */ 

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

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

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

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

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

21
Ahmad Fouad
$text = preg_replace('!/\*.*?\*/!s', '', $text);
$text = preg_replace('/\n\s*\n/', "\n", $text);
43
chaos

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

print "/* a comment */";

В это:

print "";

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

10
Chris Lutz
//  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);
5
makaveli_lcf
$string = preg_replace('#/\*[^*]*\*+([^/][^*]*\*+)*/#', '', $string);
2
Federico Biccheddu

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

2
soulmerge

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

$string = preg_replace('/(\s+)\/\*([^\/]*)\*\/(\s+)/s', "\n", $string);
2
St. John Johnson

Это хорошая функция и работает!

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

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