2010-03-19 2 views
0

Я пишу отладчик комментариев и пытаюсь приспособить для всех потребностей здесь. У меня есть следующий код кода, который удаляет почти все комментарии, но на самом деле он заходит слишком далеко. Было потрачено много времени на тестирование и тестирование шаблонов регулярных выражений, но я не утверждаю, что они лучшие в каждом.(php) regexto удалить комментарии, но игнорировать события в строках

Моя проблема заключается в том, что у меня есть ситуации, когда у меня есть «PHP комментарии» (которые на самом деле не комментирует в стандартном коде, или даже в PHP строках, что я на самом деле не хочу, чтобы удалить.

Пример:

<?php $Var = "Blah blah //this must not comment"; // this must comment. ?> 

что в конечном итоге происходит то, что он обрезает религиозно, это хорошо, но она оставляет определенные проблемы:

<?php $Var = "Blah blah ?> 

также:

также вызывает проблемы, так как комментарий удаляет оставшуюся часть строки, включая окончание?>

Смотрите эту проблему? Так это то, что мне нужно ...

  • Комментарий символов в «» или «» должны быть проигнорированы
  • PHP Комментарии к той же линии, которые используют двойные слеши, следует удалить, возможно только комментарий сам , или должен удалить весь блок кода php.

Вот шаблоны, которые я использую в данный момент, не стесняйтесь сказать мне, есть ли улучшения в моих существующих шаблонах? :)

$CompressedData = $OriginalData; 
$CompressedData = preg_replace('!/\*.*?\*/!s', '', $CompressedData); // removes /* comments */ 
$CompressedData = preg_replace('!//.*?\n!', '', $CompressedData); // removes //comments 
$CompressedData = preg_replace('!#.*?\n!', '', $CompressedData); // removes # comments 
$CompressedData = preg_replace('/<!--(.*?)-->/', '', $CompressedData); // removes HTML comments 

Любая помощь, которую вы можете мне дать, была бы весьма признательна! :)

ответ

4

Если вы хотите разобрать PHP, вы можете использовать token_get_all, чтобы получить tokens данного PHP-кода. Тогда вам просто нужно повторить токены, удалить токены комментариев и снова положить остальных.

Но вам нужна отдельная процедура для комментариев HTML, желательно и синтаксический анализатор (например, DOMDocument содержит DOMDocument::loadHTML).

+0

Хотя большинство парсеры «HTML» на самом деле XML парсеры и не сможет правильно разобрать HTML, который часто используется с PHP, так как сами файлы редко хорошо сформированы (даже если результирующая страница была). – Rithiur

+1

Вот почему DOMDocument имеет метод loadHTML, который может иметь смысл полностью противоречивого HTML. DOMDocument в сочетании с выражением na xpath exprssion, который находит все комментарии и удаляет их, кажется, является допустимым вариантом для комментариев HTML. Кроме того, он создает HTML XHTML-совместимый. – chiborg

0

Один из способов сделать это в REGEX - использовать одно составное выражение и preg_replace_callback.

Я собирался опубликовать плохой пример, но лучшее место для поиска - это исходный код для порта PHP скрипта JA-пакета Dean Edwards - вы должны увидеть общую идею.

http://joliclic.free.fr/php/javascript-packer/en/

+0

Это просто для внутреннего сжатия HTML, JS и PHP в одном скрипте, и производительность не вызывает беспокойства. На самом деле, это удивительно быстро, хотя я знаю, что REGEX заменяет как таковой не оптимальный способ для этого. Мне удалось получить то, что работает так, как я хочу, но теперь мне нужно получить его так, чтобы он удалял любую/новую строку новой строки, за исключением случаев, когда они содержатся внутри «или». Любые подсказки? Упаковщик Дина, возможно, не сможет мне помочь в этом конкретном вопросе. Это, наверное, просто, хотя ... Я немного n00b, хе-хе, это в значительной степени экспериментирование на моей стороне. – David

3

Вы должны сначала тщательно продумать, действительно ли вы хотите сделать это. Хотя то, что вы делаете, может показаться простым, в худшем случае это становится чрезвычайно сложной проблемой (для решения всего несколькими регулярными выражениями). Позвольте мне просто проиллюстрировать лишь некоторые проблемы, с которыми вам пришлось столкнуться при попытке снять как HTML, так и комментарии PHP из файла.

Вы не можете прямо из полосы HTML комментариев, потому что вы можете иметь PHP внутри HTML-комментариев, как:

<!-- HTML comment <?php echo 'Actual PHP'; ?> --> 

Вы можете не просто отдельно дело с вещами внутри <?php и ?> тегов либо , так как окончание thag ?> может быть внутри строки или даже комментарии, как:

<?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.

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

+0

Все очень хорошие моменты, и я автоматически учитывал эти ситуации с общим успехом. Как я сказал в приведенном ниже комментарии, я использую это для внутренних целей, поэтому он не должен быть совершенным. Мне удалось решить большинство моих проблем, единственное, что на моем пути теперь - удалить символы новой строки - я не хочу удалить строки в строках. Понимаете, это для моего собственного стиля кодирования в целом, поэтому я знаю, как я комментирую такие вещи и такие, и я работал над рег-ex соответствующим образом. На всех моих тестах все отлично, пока. :) Кроме «преднамеренных» строк перевода. – David

-1

попробовать это

private function removeComments($content){ 
    $content = preg_replace("!/\*.*?\*/!s" , '', $content); 
    $content = preg_replace("/\n\s*\n/" , "\n", $content);  
    $content = preg_replace('#^\s*//.+$#m' , "", $content); 
    $content = preg_replace('![\s\t]//.*?\n!' , "\n", $content); 
    $content = preg_replace('/<\!--.*-->/' , "\n", $content); 
    return $content; 
} 
Смежные вопросы