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

Я пытаюсь сделать регулярное выражение PHP для извлечения функций из исходного кода php. До сих пор я использовал рекурсивное регулярное выражение для извлечения всего между {}, но затем он также сопоставлял такие вещи, как if. Когда я использую что-то вроде:

preg_match_all("/(function .*\(.*\))({([^{}]+|(?R))*})/", $data, $matches); 

Это не работает, если в файле более 1 функции (возможно, потому, что она также использует часть «функция» в рекурсивности).

Есть какой-либо способ сделать это?

Пример файла:

 <?php if($useless) { echo "i don't want this"; } function bla($wut) { echo "i do want this"; } ?> 

благодаря

Solutions Collecting From Web of "Регулярное выражение PHP для извлечения php-функций из файлов кода"

regexps – неправильный способ сделать это. Рассмотрите токенизатор или отражение

Перемещено здесь из дублированного вопроса: PHP, Regex и новые строки

Regex решение:

 $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); } 

PS Как было предложено выше, токенизатор предпочтительнее.