Сначала вы должны тщательно подумать, действительно ли вы хотите это сделать. Хотя то, что вы делаете, может показаться простым, в худшем случае это становится чрезвычайно сложной задачей (решить с помощью нескольких регулярных выражений). Позвольте мне проиллюстрировать лишь несколько проблем, с которыми вы можете столкнуться, пытаясь убрать комментарии HTML и PHP из файла.
Вы не можете разметать комментарии HTML, потому что у вас может быть PHP внутри комментариев HTML, например:
<!-- HTML comment <?php echo 'Actual PHP'; ?> -->
Вы не можете просто отдельно разобраться с вещами внутри тегов <?php
и ?>
, так как завершающий тег ?>
может быть внутри строк или даже комментариев, например:
<?php /* ?> This is still a PHP comment <?php */ ?>
Давайте не будем забывать, что ?>
фактически завершает PHP, если ему предшествует однострочный комментарий. Например:
<?php // ?> This is not a PHP comment <?php ?>
Конечно, как вы уже иллюстрировали, будет много проблем с индикаторами комментариев внутри строк. Разбирать строки, чтобы игнорировать их, тоже не так просто, так как вы должны помнить, что кавычки можно экранировать. Как:
<?php
$foo = ' /* // None of these start a comment ';
$bar = ' \' // Remember escaped quotes ';
$orz = " ' \" \' /* // Still not a comment ";
?>
Порядок синтаксического анализа также вызовет у вас головную боль. Вы не можете просто выбрать сначала анализ однострочных комментариев или многострочных комментариев. Они оба должны быть проанализированы одновременно (т.е. в порядке их появления в документе). В противном случае вы можете получить неработающий код. Позвольте мне проиллюстрировать:
<?php
/* // Multiline comment */
// /* Single Line comment
$omg = 'This is not in a comment */';
?>
Если вы сначала анализируете многострочные комментарии, второй / * съест часть строки, разрушающую код. Если вы сначала проанализируете однострочные комментарии, вы в конечном итоге съедите первый * /, что также уничтожит код.
Как видите, существует множество сложных сценариев, которые вам необходимо учитывать, если вы собираетесь решить свою проблему с помощью регулярных выражений. Единственное правильное решение - использовать какой-то синтаксический анализатор PHP, например token_get_all()
, для токенизации всего исходного кода, удаления токенов комментариев и перестройки файла. Что, боюсь, тоже не совсем просто. Это также не поможет с комментариями HTML, так как HTML остается нетронутым. Вы также не можете использовать парсеры XML для получения комментариев HTML, потому что HTML редко формируется с помощью PHP.
Короче говоря, идея того, что вы делаете, проста, но реальная реализация гораздо сложнее, чем кажется. Поэтому я бы порекомендовал стараться избегать этого, если только у вас нет веских причин для этого.