PHP, Regex и новые строки

Возможный дубликат:
Регулярное выражение PHP для извлечения php-функций из файлов кода

У меня есть файл со списком функций, отформатированных примерно так:

function foo(){ ...code { code{} } code... } 

Для этого конкретного файла я всегда буду помещать слово «функция» целиком влево, а конечная фигурная скобка – влево. Как обычно, код внутри функции всегда будет отступом. Код внутри функции может содержать любой символ, включая фигурные скобки.

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

 $regex = "/function.*/"; preg_match_all($regex, $str, $result, PREG_PATTERN_ORDER); $arr = $result[0]; print_r($arr); 

Это приводит к следующим и остановкам в каждой новой строке:

 Array ( [0] => function foo(){ [1] => function bar(){ [2] => function stop(){ [3] => function go(){ ) 

Я попытался изменить регулярное выражение:

 $regex = "/function.*\n}$/s"; 

Мое мышление состояло в том, что там, где есть символ новой строки, непосредственно связанный с фигурной скобкой, \n}$ будет соответствовать концу функции. Однако это не работает, он создает массив с одним длинным элементом, который содержит все после function foo()

Я не начал вводить имя функции в ключ ассоциативного массива.

@John R

Это регулярное выражение:

 $regex = '~ function #function keyword \s+ #any number of whitespaces (?P<function_name>.*?) #function name itself \s* #optional white spaces (?P<parameters>\(.*?\)) #function parameters \s* #optional white spaces (?P<body>\{.*?\}) #body of a function ~six'; if (preg_match_all($regex, $input, $matches)) { print_r($matches); } 

Подобного выражения может быть достаточно в вашем случае:

 /^function\s++(\w++).*?^}/ms 

Он останавливает совпадение на первом } который не имеет отступов. Имя функции будет в первой группе захвата, и все совпадение будет функцией.