Ich habe eine Anforderung zum Parsen von PHP-Dateien in C #. Wir benötigen im Wesentlichen einige Entwickler in einem anderen Land, um PHP-Dateien hochzuladen. Nach dem Hochladen müssen wir die PHP-Dateien überprüfen und eine Liste aller Methoden und Klassen / Funktionen usw. erhalten.
Ich dachte daran, einen Regex zu verwenden, aber ich kann nicht trainieren, wenn eine Funktion zu einer Klasse usw. gehört, also habe ich mich gefragt, ob da schon etwas 'da draußen' PHP-Dateien auslesen und seine Funktionen ausspucken würde Ich versuche zu vermeiden, eine vollständige AST-Implementierung zu schreiben).
Hat jemand eine Idee? Ich schaute auf Coco / R, aber ich konnte keine PHP-Grammatikdatei finden. Ich benutze .NET 2.0 und C #.
Warum in C #? In PHP ist das trivial. Verwenden Sie die Funktion token_get_all()
und es wird eine PHP-Datei in einen Strom von Lexemen aufgeteilt, mit denen Sie die Liste von Klassen und Methoden durch Schreiben einer endlichen Zustandsmaschine.
Was auch immer Sie tun, versuchen Sie dies nicht mit regulären Ausdrücken. Es wird unglaublich langwierig und fehleranfällig sein.
Bearbeiten: Dafür gibt es drei grundlegende Möglichkeiten:
Alles andere beinhaltet entweder das Schreiben eines PHP-Parsers (viel Arbeit) oder die Verwendung wirklich flockiger regulärer Ausdrücke, die ein unzuverlässiger Support-Albtraum sein werden.
Sich über vermeintliche "Sicherheitslücken" von PHP Sorgen zu machen, hat mehrere Probleme:
Möglicherweise können Sie ctags
für Ihren Zweck verwenden. Ich bin mir nicht sicher, wie Sie es mit C # integrieren würden, da ctags in C geschrieben ist.
Wenn Sie Ihre Parser kennen, können Sie sich alternativ die Grammatikdateien in der PHP-Quelle ansehen. Insbesondere zend_ini_parser.y
und zend_language_parser.y
.
Schließlich, obwohl es nicht die beste Lösung ist, könnten Sie wahrscheinlich mit einer selbst gebrauten Handvoll regulärer Ausdrücke davonkommen. PHP's Grammatik ist ziemlich streng in Bezug auf Klassen und Funktionen. Sie müssen nur ein bisschen Staat im Auge behalten, damit Sie wissen, welcher Klasse eine Funktion gehört.