Regex для удаления комментариев и многострочных комментариев и пустых строк - PullRequest
21 голосов
/ 13 марта 2009

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

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

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

/* text */ 

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

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

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

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

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

Ответы [ 9 ]

44 голосов
/ 13 марта 2009
$text = preg_replace('!/\*.*?\*/!s', '', $text);
$text = preg_replace('/\n\s*\n/', "\n", $text);
10 голосов
/ 13 марта 2009

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

print "/* a comment */";

В это:

print "";

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

5 голосов
/ 02 октября 2013
//  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);
2 голосов
/ 03 февраля 2012
$string = preg_replace('#/\*[^*]*\*+([^/][^*]*\*+)*/#', '', $string);
2 голосов
/ 13 марта 2009

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

$string = preg_replace('/(\s+)\/\*([^\/]*)\*\/(\s+)/s', "\n", $string);
2 голосов
/ 13 марта 2009

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

0 голосов
/ 24 мая 2019

Я нашел этот вариант, который мне больше подходит, (\s+)\/\*([^\/]*)\*/\n* он удаляет многострочные комментарии с вкладками или без комментариев и отступы за ним. Я оставлю пример комментария, которому будет соответствовать это регулярное выражение.

/**
 * The AdditionalCategory
 * Meta informations extracted from the WSDL
 * - minOccurs : 0
 * - nillable : true
 * @var TestStructAdditionalCategorizationExternalIntegrationCUDListDataContract
 */
0 голосов
/ 04 октября 2012

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

<?
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 голосов
/ 31 мая 2012

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