Я хочу проанализировать файл, и я хочу использовать php и regex для разметки:
в основном я хочу удалить любую строку, содержащую
/* text */
или многострочные комментарии
/*** some text *****/
Если возможно, другое регулярное выражение, чтобы проверить, пустует ли строка (Удалить пустые строки)
Это возможно? может ли кто-нибудь отправить мне регулярное выражение, которое делает именно это?
Большое спасибо.
$text = preg_replace('!/\*.*?\*/!s', '', $text); $text = preg_replace('/\n\s*\n/', "\n", $text);
Имейте в виду, что любое используемое вами регулярное выражение не будет выполнено, если в файле, который вы обрабатываете, есть строка, содержащая что-то, что соответствует этим условиям. Например, это изменит это:
print "/* a comment */";
В этом:
print "";
Скорее всего, это не то, что вы хотите. Но может быть, я не знаю. Во всяком случае, регулярные выражения технически не могут анализировать данные таким образом, чтобы избежать этой проблемы. Я говорю технически, потому что современные регулярные выражения PCRE прикрепили к ряду хаков, чтобы сделать их обоих способными сделать это и, что более важно, уже не регулярные выражения, а что угодно. Если вы хотите избежать снятия этих вещей внутри кавычек или в других ситуациях, нет никакой замены полноразмерному парсеру (хотя он все равно может быть довольно простым).
// 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);
Это возможно, но я бы этого не сделал. Вам нужно разобрать весь файл php, чтобы убедиться, что вы не удаляете никаких необходимых пробелов (строки, пробелы с ключевыми словами / идентификаторами (publicfuntiondoStuff ()) и т. Д.). Лучше использовать расширение токенизатора PHP.
$string = preg_replace('#/\*[^*]*\*+([^/][^*]*\*+)*/#', '', $string);
Это должно работать при замене всех / * на * /.
$string = preg_replace('/(\s+)\/\*([^\/]*)\*\/(\s+)/s', "\n", $string);
Это мое решение, если оно не используется для регулярного выражения. Следующий код удаляет весь комментарий, разделенный символом #, и извлекает значения переменной в этом стиле 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); }
Это хорошая функция, и РАБОТАЕТ!
<? 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