Frage

Ich versuche, einen PHP Regex Extrakt Funktionen von PHP-Quellcode zu machen. Bis jetzt habe ich eine rekursive Regex Extrakt alles zwischen {}, aber dann auch passt es Sachen wie if-Anweisungen. Wenn ich so etwas wie:

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

Es funktioniert nicht, wenn es mehr als 1 Funktion in der Datei ist (wahrscheinlich, weil es verwendet den ‚Funktion‘ Teil in der Rekursivität auch).

Gibt es eine Möglichkeit, dies zu tun?

Beispieldatei:

<?php
if($useless)
{
  echo "i don't want this";
}

function bla($wut)
{
  echo "i do want this";
}
?>

Danke

War es hilfreich?

Lösung

regexps ist der falsche Weg, es zu tun. Betrachten Sie tokenizer oder Reflexion

Andere Tipps

Verschoben hier von doppelter Frage: PHP, Regex und neue Linien

Regex Lösung:

$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. Wie oben tokenizer vorgeschlagen ist vorzuziehen Weg zu gehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top