Match den Körper einer Funktion mit Regex
Gegeben eine Dummy-Funktion als solche:
public function handle()
{
if (isset($input['data']) {
switch($data) {
...
}
} else {
switch($data) {
...
}
}
}
Meine Absicht ist es, den Inhalt dieser Funktion zu erhalten. Das Problem besteht darin, verschachtelte Muster von geschweiften Klammern zu finden.{...}
.
Ich bin auf @ gestoßrekursive Muster aber ich konnte meinen Kopf nicht um eine Regex legen, die zum Körper der Funktion passt.
Ich habe Folgendes versucht (keine Rekursion):
$pattern = "/function\shandle\([a-zA-Z0-9_\$\s,]+\)?". // match "function handle(...)"
'[\n\s]?[\t\s]*'. // regardless of the indentation preceding the {
'{([^{}]*)}/'; // find everything within braces.
preg_match($pattern, $contents, $match);
Das Muster stimmt überhaupt nicht überein. Ich bin sicher, es ist das letzte, was falsch ist'{([^{}]*)}/'
da dieses Muster funktioniert, wenn es keine anderen Klammern im Körper gibt.
Durch Ersetzen durch:
'{([^}]*)}/';
s passte bis zum Abschlu}
des Schalters imif
Anweisung und dort gestoppt (einschließlich}
des Schalters, aber ohne das desif
).
Ebenso wie dieses Muster das gleiche Ergebnis:
'{(\K[^}]*(?=)})/m';