Я пытаюсь сделать регулярное выражение 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"; } ?>
благодаря
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 Как было предложено выше, токенизатор предпочтительнее.