I'm trying to make a PHP regex to extract functions from php source code. Until now i used a recursive regex to extract everything between {} but then it also matches stuff like if statements. When i use something like:
preg_match_all("/(function .*\(.*\))({([^{}]+|(?R))*})/", $data, $matches);
It doesn't work when there is more than 1 function in the file (probably because it uses the 'function' part in the recursiveness too).
Is there any way to do this?
Example file:
<?php
if($useless)
{
echo "i don't want this";
}
function bla($wut)
{
echo "i do want this";
}
?>
Thanks
regexps is the wrong way to do it. Consider tokenizer or reflection
Moved here from duplicate question: PHP, Regex and new lines
Regex solution:
$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);
}
P.S. As was suggested above tokenizer is preferable way to go.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With