AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte PHP Inspection Unit
Thema durchsuchen
Ansicht
Themen-Optionen

PHP Inspection Unit

Ein Thema von mirage228 · begonnen am 1. Nov 2004 · letzter Beitrag vom 19. Aug 2007
Antwort Antwort
Seite 4 von 14   « Erste     234 56     Letzte »    
Benutzerbild von mirage228
mirage228
Registriert seit: 23. Mär 2003
Hallo,

ich habe mich die letzter Zeit ein wenig mit regulären Ausdrücken beschäftigt. Daraus ist die folgende Unit entstanden.

Mit ihr ist es möglich eine PHP Datei zu analysieren. Dabei werden Klassen und Interfaces mit deren Methoden und Variablen aufgelistet, sowie Methoden ohne Klassenbezug und eingebundene Dateien (über include, require, etc.).
Ab Version 1.9 gibt es auch eine vollständige Unterstützung für Konstanten jeglicher Art (define oder PHP5-Klassenkonstanten).

Das ganze wird hierarchisch in einer Klassenstruktur zusammengefasst. Die für Benutzer relevante Klasse sollte die Klasse TPHPSource in der Unit uPHPInspector.pas sein. Ihr wird beim Konstruktor der PHP Quelltext übergeben und daraus werden die Klassen etc. herausgeparsed. Die anderen Klassen in der Unit sollten nicht direkt instanziert werden.
Die Verwendung der Eigenschaften der einzelnen Klassen sollte relativ einfach sein. Bei Rückfragen, bitte hier in den Thread schreiben.

Zum Parsen verwende ich, wie gesagt, reguläre Ausdrücke. Da die native Delphi Bibliothek Hier im Forum suchenTRegExpr in einem für mich wichtigem Punkt nicht ganz vollständig war, bin ich auf die Wrapperklasse von http://www.renatomancuso.com umgestiegen. Der einzige Nachteile daraus ist der größere overhead, da Anwendungen die PCRE.dll mitliefern müssen, die mit knapp 200 KB zu Buche schlägt.

Neu ab Version 1.2:
Es lässt sich nun eine Syntaxprüfung durchführen. Dazu muss man die Funktion SyntaxCheck der Klasse TPHPSource aufrufen. Dabei kann man zwischen reiner Syntaxprüfung und einer vollständigen Ausführung der Datei wählen. Bei der Syntaxprüfung werden nur rein syntaktische Fehler erkannt. Nicht vorhandene Include-Dateien oder undefinierte Funktionen werden nicht erkannt. Dazu muss der erste Parameter auf TRUE gesetzt werden.
Im Zweiten Parameter "FileName" kann noch eine Datei zur Syntaxprüfung übergeben werden (Die Datei wird nicht automatisch von TPHPSource geparsed!)
Wichtig beim Testen eurer Sources ist, dass ihr die <? und ?> nicht vergessen dürft, da die Syntaxprüfung ansonsten immer = TRUE ergibt (der Text wird dann einfach ausgegeben ohne geparsed zu werden). Zudem wird euer Source dann nicht vom PHP Inspector geparsed, wenn die PHP-Tags (<? .. ?>) fehlen (ab Version 1.6).
Das Verhalten kann durch die StrictPHPTagCheck Eigenschaft beeinflusst werden.

Im Anhang befinden sich nun:
  • PHPInspector.zip Der "PHP Inspector" in der Version 2.6 (PCRE.dll und Wrapper Units included; Version 5.0 vom 26. Oktober 2004)
  • sample_application.zip Eine Beispielanwendung, samt Source.
  • php_source_analyzer.jpg Ein Screenshot der Beispielanwendung.

Freue mich auf euer Feedback

mfG
mirage228
Miniaturansicht angehängter Grafiken
php_source_analyzer_685.jpg  
Angehängte Dateien
Dateityp: zip phpinspector_160.zip (130,1 KB, 273x aufgerufen)
Dateityp: zip sample_application_661.zip (334,9 KB, 301x aufgerufen)

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
 
Benutzerbild von mirage228
mirage228

 
Delphi 2010 Professional
 
#31
  Alt 21. Nov 2004, 20:24
Abend,

so die neue Version (1.6) ist nun fertig.

Hier ist der Changelog:
  • Wie gewünscht habe ich eine Klasse TPHPIncludeFile für Includes genommen
  • TPHPClass ist nun Nachfahre von TPHEntity
  • Nur Code in PHP-Tags (<? ... ?>) wird geparsed
  • Bei Interfaces wird nun auchgeprüft, ob diese auskommentiert sind, bevor alles eingelesen wird
  • AnsiCompareStr() Aufrufe durch direkte Stringvergleiche ersetzt (schneller)
  • Neue Eigenschaften Head und Body in TPHPMethod
  • Eigenschaften BeginBracket und EndBracket für TPHPMethod, TPHPClass und TPHPInterface
  • Der Methodenkörper mit dem Code wird nun auch geparsed, um den Anfang und Ende der Methode bestimmen zu können. Diese Option kann bei Bedarf über den Compilerschalter $PARSEMETHODBODY deaktiviert werden.
  • Jeder TPHPEntity Nachfahre hat nun die Eigenschaft Parent vom Typ TPHPClass. Dadurch kann man einfach herausfinden, wozu z.B. eine Methode gehört. Methoden ohne Klassenbezug haben die TPHPSource Instanz als Parent, da dieser auch von TPHPClass abgeleitet ist, sowie die Klassen und Interfaces selbst.
  • Einige Code- und Geschwindigkeitsoptimierungen

In der/den nächsten Version(en) wird es noch PHPDoc Support geben (mal schaun, wie sich das machen lässt) und ich werde versuchen Variablen im Source erkennen zu lassen.

Downloads gibts, wie gehabt, im ersten Beitrag

mfG
mirage228
David F.
  Mit Zitat antworten Zitat
DSeven
 
#32
  Alt 22. Nov 2004, 15:31
Guten Tag,

Danke für den neuen Release.
Aber wie es aussieht hast du ihn vorher nicht getestet?

Ich bekomme wenn ich den Namen einer funktion abrufe nicht den Namen sondern alles samt body.
Außerdem wenn ich über den Schalter das mit dem Body einlesen abschalte bekomme ich ein paar fehler das variablen fehlen und so.

Solltest einen Bug Fix machen. ah und noch was bei meinen Interfaces liest er jetzt nicht mal die funktionen ein.

mfg,
DSeven
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

 
Delphi 2010 Professional
 
#33
  Alt 22. Nov 2004, 15:59
Zitat von DSeven:
Guten Tag,

Danke für den neuen Release.
Aber wie es aussieht hast du ihn vorher nicht getestet?

Ich bekomme wenn ich den Namen einer funktion abrufe nicht den Namen sondern alles samt body.
Außerdem wenn ich über den Schalter das mit dem Body einlesen abschalte bekomme ich ein paar fehler das variablen fehlen und so.

Solltest einen Bug Fix machen. ah und noch was bei meinen Interfaces liest er jetzt nicht mal die funktionen ein.

mfg,
DSeven
Hi,

oh, sorry, das sind mir wohl ein paar Fehler unterlaufen

Einmal hatte ich den Schalter falsch herum gemacht und einmal hatte ich in einem Konstruktor (bei deaktiviertem Schalter) den ersten Parameter vergessen.
Das mit den Interfaces war ein kleiner Folgefehler, der zu Folge hatte, dass der Text bereits in einem übergeordnetem Konstruktor gesetzt wurde, ohne dabei jedoch zu parsen. Und beim Setzen über die property hat das dann nicht funktioniert, weil die Texte ja "gleich" waren. Ich hab das mal gelöst, indem beim Konstruktor von TPHPClass auf jeden fall ParseEntity aufgerufen wird.
Das mit dem Abrufen des Funktionsnamen konnte ich nicht nachvollziehen. Bei mir gibt TPHPMethod.Name immer einen korrekten Wert zurück

Auf jeden Fall sind die Fehler behoben - Downloads gibts gleich ab sofort im ersten Beitrag

mfG
mirage228
David F.
  Mit Zitat antworten Zitat
DSeven
 
#34
  Alt 22. Nov 2004, 21:43
Zitat von mirage228:
Das mit dem Abrufen des Funktionsnamen konnte ich nicht nachvollziehen. Bei mir gibt TPHPMethod.Name immer einen korrekten Wert zurück

Auf jeden Fall sind die Fehler behoben - Downloads gibts gleich ab sofort im ersten Beitrag

mfG
mirage228
Guten Tag,

Danke für den schnellen Fix.
Ja und das mit den Funktionen hast du recht Ich habe statt Name immer Occurence benutzt Also mein fehler.

mfg,
DSeven
  Mit Zitat antworten Zitat
DSeven
 
#35
  Alt 22. Nov 2004, 21:50
Guten Tag,

Also wenn der {$DEFINE PARSEMETHODBODY} Flag gesetzt ist zeigt er mir die Interface funktionen nicht an, wenn er nicht gesetzt ist werden sie angezeigt.

mfg,
DSeven
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

 
Delphi 2010 Professional
 
#36
  Alt 23. Nov 2004, 09:03
Zitat von DSeven:
Guten Tag,

Also wenn der {$DEFINE PARSEMETHODBODY} Flag gesetzt ist zeigt er mir die Interface funktionen nicht an, wenn er nicht gesetzt ist werden sie angezeigt.

mfg,
DSeven
Hi,

bei mir werden Interface Funktionen in jedem Fall erkannt. Wie sieht denn Deine Deklaration aus?
Ah, hab den Fehler! Der sucht versehentlich nun auch bei Interface nach den {} !

mfG
mirage228
David F.
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

 
Delphi 2010 Professional
 
#37
  Alt 23. Nov 2004, 09:54
Hi,

so das ist nun auch behoben.
Ich habe mal ein paar Beispiele aus der PHP Doku ausprobiert und es scheint wirkich alles zu gehen

Die aktualisierten Downloads befinden sich im ersten Beitrag

mfG
mirage228
David F.
  Mit Zitat antworten Zitat
DSeven
 
#38
  Alt 23. Nov 2004, 12:14
Guten Tag,

Ja jetzt geht es wirklich.
Habe aber nebenher was neues gefunden was zu bemengeln ist.

Undzwar parst dein Parser nur Code der zwischen <? ?> steht aber es gibt durchaus programmierer die nur einen anfangs Tags <? setzen und denn ende Tag nicht und mich würde es freuen wenn er alles nach <? parst auch wenn der Tag nicht geschlossen wurde.

mfg,
DSeven
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

 
Delphi 2010 Professional
 
#39
  Alt 23. Nov 2004, 12:20
Zitat von DSeven:
Habe aber nebenher was neues gefunden was zu bemengeln ist.

Undzwar parst dein Parser nur Code der zwischen <? ?> steht aber es gibt durchaus programmierer die nur einen anfangs Tags <? setzen und denn ende Tag nicht und mich würde es freuen wenn er alles nach <? parst auch wenn der Tag nicht geschlossen wurde.
Hm, ist eigentlich syntaktisch nicht korrekt, aber selbst PHP.exe scheint es so zu akzeptieren
Na, dann werde ich das noch einbauen - in Form eines Parameters, wie "StrictPHPTagCheck" oder so.

mfG
mirage228
David F.
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

 
Delphi 2010 Professional
 
#40
  Alt 23. Nov 2004, 21:00
Abend,

so ich habe in der neuen Version 1.7 noch ein paar Dinge ergänzt - neben Deinem Vorschlag, DSeven

Was sich geändert hat:
  • Über die Eigenschaft StrictPHPTagCheck von TPHPSource kann das Verhalten beim Verarbeiten von nicht geschlossenen PHP-Tags beeinflusst. Ist der Parameter = FALSE werden auch nicht geschlossene Tags akzeptiert, was bei gemischten (HTML/PHP) Dokumenten möglicherweise zu falschen Ergebnissen führt. Ist der Parameter = TRUE werden nur syntaktisch korrekte Dokumente akzeptiert.
  • Die Eigenschaft VarName von TPHPVariable war fehlerhaft, falls die Variable mit einem Wert initialisert wurde.
  • Methoden in Klassen werden nun mit TPHPClassMethod dargestellt. TPHPMethod ist vorwiegend für Methoden ohne Klassenbezug, da diese keine Abstrakten und Finalen oder Statischen Funktionen erlauben und somit einen einfacheren RegEx benötigen. Das wirkt sich positiv auf die Parsing Zeit aus
  • Methoden in Interfaces werden durch die Klasse TPHPInterfaceMethod dargestellt.
  • Eigenschaft IsStatic für TPHPClassMethod und TPHPVariable.

Ich habe diesmal etwas ausführlicher getestet, um Fehler zu vermeiden. Falls ich doch noch Fehler gemacht haben sollte -> Immer her damit

Downloads gibts, wie immer , im ersten Beitrag.

mfG
mirage228
David F.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 14   « Erste     234 56     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz