<?php
$functionDef = <<<'EOF'
<?php
function notThisOne( $baz = 'boz') {}
function foo ( Bar $bar, Baz $baz = 'string with, comma', $boz = ['something'] ) {
}
EOF;
$function = 'foo';
$argument = 'baz';
if (!preg_match('/function\s+' . preg_quote($function) . '\s*\(\s*(?P<args>.*?)\)/is', $functionDef, $matches)) {
throw new RuntimeException('Cound not find parameters for function ' . $function);
}
$tokens = token_get_all('<?php ' . $matches['args']);
// small state machine, better in a class
$foundArg = false;
$default = '';
while ($token = next($tokens)) {
// find the argument first of all
if (!$foundArg) {
if (is_array($token) && $token[1] == '$'.$argument) {
$foundArg = true;
}
continue;
}
// detect when we have got to the end of the definitoin
if ($token === ',') {
break;
}
// compile everything else into the string
if (is_string($token)) {
$default .= $token;
}
else {
$default .= $token[1];
}
}
var_dump($default);