Возможный дубликат:
Регулярное выражение 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 
  Он останавливает совпадение на первом } который не имеет отступов.  Имя функции будет в первой группе захвата, и все совпадение будет функцией.