Fastto
@Fastto

Помогите с регулярками

Есть задача — удалить из кода php все комментарии

Регулярки обрабатываю классом regexp .NET 3.5

Детально:
1) Удалить все линейные комментарии
2) Удалить все блочные комментарии
3) Удалить все переносы строк

код:
if (ext.ToLower() == "php" )
                {
                    string content = File.ReadAllText(file, System.Text.Encoding.UTF8);

                    content = Regex.Replace(content, @"\/\/.*(\r?\n)?", @"");
                    content = Regex.Replace(content, @"\/\*(.*(\r?\n)?)*.*\*\/", @"");
                    content = Regex.Replace(content, @"\r?\n", @" ");

                    File.WriteAllBytes(dst + fileName, System.Text.Encoding.UTF8.GetBytes( content ));
                }
}

1 — работает, но по упрощенной схеме, если подсунуть например — echo «3;//3»; // 33 — удалит не то, что нужно
2 — не могу добиться внятного результата — или удаляет половину кода или вообще ничего не трогает
3 — работает
  • Вопрос задан
  • 3000 просмотров
Решения вопроса 1
gaelpa
@gaelpa
Комментарии удобно удалять самим пхп «php -w» он, правда, еще и пробелы режет.
ИМХО — то, что нужно, достаточно иметь бинарник пхп.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
taliban
@taliban
php программист
Я бы на вашем месте изменил регулярки с учетом несокльих строк, тогда не нужно будет вставлять в них \r\n\s и подобные. А во вторых регурярками вы не добьетесь правильной работы:

\\ comment
$a = '\\ not comment'; - такое Вы учитываете?

В свое время делал одну штуковину, которая подсвечивала код, там мне тоже нужно было парсить каменты и текст, я пытался все сделать через регулярки, но в итоге забил и переписал все перебором:
(многострочные каменты нужно искать так (я так искал текстовые строки, но к каментам тожеподходит):
1. проходим по тексту посимвольно (либо ищем открывающийся комент в тексте)
2. проверяем валидный ли он, не в тексте, не в другом каменте, не экранирован, итд
3. ищем ближайлий закрывающий камент, тоже все проверяем
4. удаляем текст от начальной позиции до конечной
Однострочные проще, в принципе то же но в одной строке, просто быстрей получается.
Регулярки тут бессильны, слишком много вариантов когда оно будет глючить (обычно строки)
5. идем на пункт 1 пока находятся парные каменты
Ответ написан
Комментировать
Nastradamus
@Nastradamus
обычно мне помогает:
www.gskinner.com/RegExr/
Ответ написан
Комментировать
Magiq
@Magiq
Чисто регулярками очень сложно будет, особенно парсить что то вроде get(' example.com');
Ответ написан
Magiq
@Magiq
*
<? php get(' example.com'); ?>
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы