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