2009-03-13 2 views
19

Я хочу, чтобы разобрать файл, и я хочу использовать PHP и регулярные выражения раздеться:Regex раздеться комментарии и многострочных комментариев и пустых строк

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

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

/* text */ 

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

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

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

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

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

+0

Связанные: http://stackoverflow.com/questions/503871/best-way-to-automatically-remove -comments-from-php-code – user956584

ответ

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

Большое спасибо! Первое регулярное выражение удалило однострочные комментарии. Однако второе регулярное выражение не изменилось и не удаляло многострочные комментарии. Я ценю ваш ответ .. снова спасибо –

+0

Удостоверьтесь, что у вас есть! S на первом регулярном выражении; это было не в моем первоначальном ответе. Именно поэтому он обрабатывает многострочные комментарии. Второй шаблон удаляет пустые строки. – chaos

+0

The! S заставляет его работать на 100%. Он работает намного лучше, чем мое регулярное выражение, +1 от меня. –

10

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

print "/* a comment */"; 

В это:

print ""; 

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

2

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

+0

Я хочу рассчитывать только на регулярное выражение. Файл слишком прост, у него есть несколько комментариев по одной строке, многострочный комментарий и некоторые PHP-коды (каждая в новой строке). Я просто хочу, чтобы формула регулярных выражений делала очистку ... поэтому я могу использовать вывод в браузере для разного использования. –

+0

Имейте в виду, что только для регулярного выражения будет отсутствовать «здесь документы». Чтобы правильно идентифицировать такой текст, вам действительно нужно использовать токенизатор. – Peter

1

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

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

Цените свою помощь. Спасибо! –

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

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

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

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

Loadi нг 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

Это отлично работает. Но есть одна проблема: не нужно удалять пустые строки, откуда удаляются комментарии. Если файл содержит 500 строк комментариев, слова удаляются, но пустые строки все равно будут там. Можете ли вы сказать нам правильный способ удаления этих пустых строк. –

+0

Для того, чтобы удалить пустые строки: preg_replace ('/ \ n \ s * \ n /', '', $ code) или рядом удалить только пустые строки начала: preg_replace ('/^\ n \ s * \ n/',' ', $ code) –

4
// 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); 
+1

Замечание по замене одной строки не работает, когда есть URL-адреса. 'https: // example.com' также заменяется. – ascx