Schnelles Parsen von PHP in C #

7

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 #.

    
cletus 16.09.2009, 03:22
quelle

2 Antworten

18

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:

  1. Mach es in PHP. Dies wird die schnellste (zu entwickelnde) und einfachste Option sein;
  2. Führen Sie ein PHP-Skript in der Befehlszeile aus, um dies zu tun, oder generieren Sie eine Reihe von Tokens, die von einem C # -Programm interpretiert werden können. Dies ist der nächste einfachste;
  3. Verwenden Sie Phalanger , einen PHP-Port für das .Net-Framework. Dies könnte für das Management schmackhafter sein, da es immer noch alles .Net-Code ist; oder
  4. Verwenden Sie Quercus , einen PHP-Port für die Java VM.

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:

  1. Jeder Framework- oder Technologie-Stack kann Sicherheitslücken aufweisen. Die Tatsache, dass Ihr Sysadmin nur effektiv .NET unter Protest gegen Java erlaubt, zeigt nur irrationale Voreingenommenheit. Ich sage das als langjähriger Java-Entwickler: Java, .Net und PHP können alle Sicherheitslücken aufweisen;
  2. Sie können PHP über die Befehlszeile ausführen, so dass es keine HTTP-Anfragen liefert, was das Problem der Sicherheitsfehler im Grunde auf Null reduziert;
  3. Wenn Sie sich über interne Sicherheitsbedrohungen Sorgen machen (von jemandem mit Zugriff auf die Box), beschränken Sie die ausführbare PHP CLI-Datei nur auf die Ausführung durch eine Gruppe, in der sich nur Ihr Programm befindet.
cletus 16.09.2009 03:28
quelle
1

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.

    
troelskn 16.09.2009 07:45
quelle

Tags und Links