Оптимайз — 2

Все помнят, как я здорово придумал вместо 20 include’ов писать 1?

Тогда прозвучала мысль, что если еще и выкинуть из склеиваемых исходников комментарии, то всё будет еще быстрее и красивее. Вопрос был в том, как их выкинуть.

Первое, что приходило в голову, это почикать регэкспом всё, что между /* и */, а также между // или # — и ньюлайном. Но это, как вы понимаете, полная лажа, ведь так мы с успехом почикаем то, что лежит в строках или HTML-коде. Чего делать не следует. Разбирать же весь синтаксис PHP ой как не хочется, тем более, что за тебя это уже один раз сделали авторы языка.

Потом Смирнов дал ссылку на POBS (так, кажется, это называется?), который, вроде как, делает, в том числе и тотальный вырез комментариев... Короче, все решения были либо неправильными, либо слишком навороченными. Но тут я придумал нечто очень красивое.

В PHP есть функция-парсер! Только она замаскирована под синтакс-хайлайтер. И называется она highlight_string. Самые умные уже всё поняли, и им дальше не интересно. А просто умные читают дальше.

Итак, функция берет переданный ей код на PHP и подсвечивает в нём синтаксис. Как? Да она просто расставляет вокруг всех комментариев <font color="#FF8000"> и </font>! Это не может не радовать. Ну, дальше всё понятно.

function strip_comments ($code) {
  // находим комментарии
  $code = highlight_string ($code, true);
  // вырезаем их
  $code = preg_replace (
    '/&lt;font color="#ff8000"&gt;(.*?)&lt;/font&gt;/i',
    '', $code);
  // вырезаем все теги, которые расставил хайлайтер -
  // больше они нам не нужны
  $code = preg_replace ('/<(?!?)(.*?)(?&lt;!?)&gt;/', '', $code);
  // заменяем расставленные хайлайтером всюду
  // неразрывные пробелы на обычные
  $code = str_replace ('&amp;nbsp;', ' ', $t);
  // восстанавливаем то, что там было раньше
  $code = unhtmlentities ($t);
}

5 строк.

Update: Благодаря этому собранный Plif из 92-килобайтного файла превратился в 77-килобайтный. Мелочь, а приятно.

Дальше
3 комментария
Spectator 2003

Так, я не помню, какой именно код хайлайтер раставляет, так что вопрос — а если у тебя внутри php-кода есть html-код, он его случайно не вырежет?

Илья Бирман

Не вырежет, так как хайлетер-то его htmlspecialchar’ит сначала, не зря же он в браузере нормально потом выглядит. Поэтому я делаю в конце unhtmlentities().

Станислав Линке 2003

В то время, когда можно взять и поставить PHP accelerator, вы занимаетесь фигнёй.

gray 2004

php -w

Илья Бирман

Потрясающе, а теперь сделайте это из скрипта, который выполняется в safe mode

Мои книги