Ответ 1
$text = preg_replace('!/\*.*?\*/!s', '', $text);
$text = preg_replace('/\n\s*\n/', "\n", $text);
Я хочу проанализировать файл, и я хочу использовать 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('/(\s+)\/\*([^\/]*)\*\/(\s+)/s', "\n", $string);
$string = preg_replace('#/\*[^*]*\*+([^/][^*]*\*+)*/#', '', $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);
}
Это хорошая функция, и 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
Я обнаружил, что этот (\s+)\/\*([^\/]*)\*/\n*
мне больше подходит, (\s+)\/\*([^\/]*)\*/\n*
он удаляет многострочные комментарии с вкладками или без них и отступы за ним. Я оставлю пример комментария, который будет соответствовать этому регулярному выражению.
/**
* The AdditionalCategory
* Meta informations extracted from the WSDL
* - minOccurs : 0
* - nillable : true
* @var TestStructAdditionalCategorizationExternalIntegrationCUDListDataContract
*/