2013-11-30 5 views
1

Я хочу создать сценарий, который удалит все комментарии из файла. Мой текущий регулярное выражение это:preg_replace() все события

$new = preg_replace_all("/(\/\*.*\*\/)/s", "", $contents); 

, который соответствует (и удаляет) ничего между /* и */

Проблема становится очевидной, когда содержимое файла является то, как это, например:

/* First comment */ 
first_function(); 

/* Second comment */ 
second_function(); 

Вместо того, чтобы удалить первый и второй комментарии и оставить оба вызова функций, мое регулярное выражение соответствует всем значениям от первого /* до последних */ и th мы полностью удаляем звонок first_function().

Я полагаю, решение было бы заменить мой .* (который соответствует любому) с чем-то, что говорят, что матч ничего , пока не дойдете до */. Но я не знаю, как это написать. Я ожидал, что это будет что-то вроде [^\*\/], но оно не работает должным образом.

Какое правильное регулярное выражение?

ответ

3

Вы были очень близки. Все, что вам нужно было использовать нежадным матч характер ? после .* следующим образом:

$new = preg_replace_all("/(\/\*.*?\*\/)/s", "", $contents); 
           ^
           ^
           ^
           ^

Только один знак вопроса все, что вам нужно ...

Смотрите это на работе here

+1

Нежелательный символ соответствия ... Мне нравится его имя: P Спасибо. – 3Nex

Смежные вопросы