Подтвердить что ты не робот

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

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

  • пустые или пустые строки
  • комментарии одной строки
  • несколько строк комментариев

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

/* text */ 

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

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

print "/* a comment */";

В это:

print "";

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

Ответ 3

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

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

Это хорошая функция, и WORKS!

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

Ответ 9

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

/**
 * The AdditionalCategory
 * Meta informations extracted from the WSDL
 * - minOccurs : 0
 * - nillable : true
 * @var TestStructAdditionalCategorizationExternalIntegrationCUDListDataContract
 */