Как удалить однострочные комментарии в php (например, "// удалить этот комментарий")? - PullRequest
4 голосов
/ 24 марта 2011

Я хочу удалить все однострочные комментарии (например, //comments) из моего кода с помощью регулярного выражения.

На данный момент я использую: preg_replace('/\/\/(.*)/','',$html);, но он также удаляет строки вроде http://example.com.

Ответы [ 6 ]

8 голосов
/ 24 марта 2011

Возможно, лучшим способом было бы использовать сам движок PHP, возможно, используя token_get_all(). Эта функция токенизирует скрипт PHP, поэтому вы можете просматривать его точно так же, как PHP, и, следовательно, удалять или заменять комментарии.

Выполнение этого с одним регулярным выражением в лучшем случае было бы кошмаром, и, скорее всего, вообще невозможно.

3 голосов
/ 24 марта 2011

Вы не можете сделать это надежно.Нет гарантии, что // в любой позиции в файле означает комментарий в контексте PHP.Например, он вполне может содержаться в строке.

Подойти к этому можно только с несколькими уступками.Например, если этого достаточно, если он перехватывает // comments в одной строке, тогда это будет вариант с меньшим количеством ложных срабатываний:

$source = preg_replace('#^\s*//.+$#m', "", $source);

Реальным решением будет использование синтаксического анализатора языка, но это, очевидноизлишество.Поэтому попробуйте добавить некоторые эвристики, чтобы избежать неправильных событий.

1 голос
/ 24 марта 2011
 preg_replace('/.*?:?(\/\/.*)/','',$html);

Вы можете попробовать что-то подобное, но я уверен, что вы можете безопасно использовать регулярные выражения для учета всех возможных крайних случаев.

Однако, как уже упоминалось выше, использование токенизатора лучше и болеенадежный способ сделать это.Фактически, есть пример того, как удалить комментарии из файла PHP в комментариях на страницах справки php.net, см. Здесь .Это может послужить хорошей отправной точкой, но я рекомендовал проверить это на себе.Код в комментариях на страницах справки php.net часто бывает немного хитрым.

0 голосов
/ 04 июля 2011
function stripPhpComments($code)
{
    $tokens = token_get_all($code);
    $strippedCode = '';

    while($token = array_shift($tokens)) {        
        if((is_array($token) && token_name($token[0]) !== 'T_COMMENT') 
            || !is_array($token)) 
        {
            $strippedCode .= is_array($token) ? $token[1] : $token;
        }
    }
    return $strippedCode;        
}
0 голосов
/ 24 марта 2011

Если у вас нет другой альтернативы, могу я предложить.Хотя с точки зрения производительности это не лучший подход.

$lines = explode("\n", $source);
$lines = array_map(
  function($line) {
    return preg_replace("@\s*//.*$@", '', $line);
  },
  $lines
);
$source = implode("\n", $lines);
0 голосов
/ 24 марта 2011

Если вы хотите минимизировать ваш код PHP, почему бы не использовать php_strip_whitespace () ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...