AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte PHP Inspection Unit

PHP Inspection Unit

Ein Thema von mirage228 · begonnen am 1. Nov 2004 · letzter Beitrag vom 19. Aug 2007
Antwort Antwort
Seite 3 von 14     123 4513     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, 272x aufgerufen)
Dateityp: zip sample_application_661.zip (334,9 KB, 300x aufgerufen)

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
 
DSeven
 
#21
  Alt 16. Nov 2004, 15:06
Guten Tag,

So habe bei mir das ganze auf VirtualTree umgestellt hier die Speed Ergebnisse:
400~ KB Datei:
VirtualTree: 50~ ms
TreeView: 1400~ ms

Also ist deutlich.
Also dein Parser ist schon gut, aber wenn du noch mehr optimieren könntest würde ich mich freuen. Aber für den normalen gebrauch ist es natürlich schon mehr als geeignet.

PS: Und das mit dem genauso schnell wie PHPEdit nehme ich zurück.
Dein Parser ist viel schneller. Habe es mit der 400 KB Datei getestet.
PHPEdit: 1 Minute und 40 Sekunden
Deiner: 900~ ms

Also PHPEdit kan einpacken. Obwohl PHPEdit weniger parst. Zum Beispiel parst es keine Interaces. Und public, private und so weiter interessiert den auch nicht. Ich glaube aber eher das liegt dadran das er noch variablen parst und das brauch zeit.
mfg,
DSeven
  Mit Zitat antworten Zitat
DSeven
 
#22
  Alt 16. Nov 2004, 21:30
Guten Tag,

Habe zwei Fehler im Parser gefunden. Währe nett wenn du sie beseitigen könntest:

1. Wenn ich folgenden Text in einer Datei stehen habe:
remember to include detailed reproduction steps and a stack trace if you have one. You can also submit other feedback;

Dan parst er ihn und fügt einen eintrag ins Treeview ein das er eine include gefunden hat die dann bis zum ; Symbol geht.

2. Es währe nett wenn dein Parser nur PHP Code parsen würde.
Also erstmal prüft ob das was er parst in den Tags <? ?> drin ist.

Ah und noch ein kleiner Verbesserungsvorschlag:
Ich fände es ziemlich geil wenn du bei klassen, funktionen und interfaces noch zwei Variablen machst.
StartBracket und endBracket oder so. Die mir die Position von den Klammern sagen.

Hoffe ich nerve dich nicht alzusehr.

mfg,
DSeven
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

 
Delphi 2010 Professional
 
#23
  Alt 17. Nov 2004, 05:59
Hi,

erstmal Danke für das positive Feedback bzgl. der Geschwindigkeit

Nun zu deinen Fragen / Wünschen :

Zitat:
währe es eigentlich möglich ohne viel Zeit zu verlieren auch Variablen zu parsen die keinen klassen bezug haben wie in PHPEdit? Währe das letzte Feature was ich vermisse.
Hi,
ich kann versuchen das einzubauen. Wie sich das aber auf die Geschwindigkeit auswirken wird, kann ich dir im vorraus nicht sagen...

Zitat:
PHPDoc support währe auch klasse.
In welcher Weise sollte der sich äußern?

Zitat:
1. Wenn ich folgenden Text in einer Datei stehen habe:
remember to include detailed reproduction steps and a stack trace if you have one. You can also submit other feedback;

Dan parst er ihn und fügt einen eintrag ins Treeview ein das er eine include gefunden hat die dann bis zum ; Symbol geht.
Wenn das nicht in einem Kommentar steht, ist das ja auch kein Wunder da der RegEx nach "inlclude <egal welche zeichen>;" sucht.
Das war für mich am einfachsten, da ich sonst alle Fälle hätte durchlaufen müssen (mal mit Klammer, mal ohne, mal mit Anführungszeichen, mal ohne. Dann werde ich mir diesbezüglich was einfallen lassen...

Zitat:
2. Es währe nett wenn dein Parser nur PHP Code parsen würde.
Also erstmal prüft ob das was er parst in den Tags <? ?> drin ist.
Oh, wo Du das gerade sagst Das wäre ne gute Idee!
(Ließe sich damit evtl. auch Problem 1 lösen?)

Zitat:
Ich fände es ziemlich geil wenn du bei klassen, funktionen und interfaces noch zwei Variablen machst.
StartBracket und endBracket oder so. Die mir die Position von den Klammern sagen.
Bei Klassen ist das kein Problem, weil sowieso der gesamte Body ({ ... }) geparsed wird. Bei Funktionen müsste ich das dann noch nachholen, weil in diesen bisher nur der Kopf ("function x()") geparsed wird.

Dann muss ich halt schauen, wie sich das ganze auf die Geschwindigkeit auswirkt - aber extreme Verluste wird es wohl nicht geben.

Zitat:
Hoffe ich nerve dich nicht alzusehr.
Keineswegs

mfG
mirage228

P.S.:
Zitat von Pr0g:
Ich werde mich mal umschauen, ob ich eine passenden Lib finden kann.
Ok, Danke - Wenn Du was Gutes (und Schnelles? ) gefunden hast, melde Dich einfach
David F.
  Mit Zitat antworten Zitat
DSeven
 
#24
  Alt 17. Nov 2004, 07:58
Zitat von mirage228:
Zitat:
währe es eigentlich möglich ohne viel Zeit zu verlieren auch Variablen zu parsen die keinen klassen bezug haben wie in PHPEdit? Währe das letzte Feature was ich vermisse.
Hi,
ich kann versuchen das einzubauen. Wie sich das aber auf die Geschwindigkeit auswirken wird, kann ich dir im vorraus nicht sagen...
Sollte aber auschaltbar sein falls es zu langsam ist.

Zitat von mirage228:
Zitat:
PHPDoc support währe auch klasse.
In welcher Weise sollte der sich äußern?
Also er soll die PHPDocs Tags parsen und dann der Funktion klasse hinzufügen oder so.
Man kann ja mit PHPDoc zum Beispiel beschreibungen für Funktionen erstellen. Und der parser sollte der funktion dann diese Beschreibung hinzufügen.


Zitat von mirage228:
Zitat:
2. Es währe nett wenn dein Parser nur PHP Code parsen würde.
Also erstmal prüft ob das was er parst in den Tags <? ?> drin ist.
Oh, wo Du das gerade sagst Das wäre ne gute Idee!
(Ließe sich damit evtl. auch Problem 1 lösen?)
Glaube schon

Also das wichtigste für mich ist erstmal eigentlich das er nur ziwschen den Tags <? ?> parst. Das ist mir sehr wichtig, das andere ist nicht so wichtig.

mfg,
DSeven
  Mit Zitat antworten Zitat
Benutzerbild von Pr0g
Pr0g

 
Delphi 7 Personal
 
#25
  Alt 17. Nov 2004, 13:14
Ich kenne mich mit regulären Ausdrücken nicht so gut aus, hier mal ein Link: Link. Es ist eine Komponente, die reguläre Ausdrücke nach Perl 5 unterstützt.

Vielleicht kannst du dir den Link mal angucken und mir sagen, ob deine Unit damit funktionieren könnte. Falls ja, du aber bei deiner Dll Variante bleiben willst, kann ich versuchen deinen Code auf die Komponente umzuschreiben?
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

 
Delphi 2010 Professional
 
#26
  Alt 17. Nov 2004, 13:19
Zitat von Pr0g:
Ich kenne mich mit regulären Ausdrücken nicht so gut aus, hier mal ein Link: Link. Es ist eine Komponente, die reguläre Ausdrücke nach Perl 5 unterstützt.

Vielleicht kannst du dir den Link mal angucken und mir sagen, ob deine Unit damit funktionieren könnte. Falls ja, du aber bei deiner Dll Variante bleiben willst, kann ich versuchen deinen Code auf die Komponente umzuschreiben?
Hi,

Danke für Deinen Mühen. Leider ist die Komponente kommerziell und selbst die "Freeware" Version hat eine sehr nervige Einschränkung:
Zitat:
A small reminder pops up only when you run your application outside the Delphi IDE.
Daher kommt eine Verwendung für mich zumindest nicht in Frage...
[edit]Wenn Du diese, oder eine andere, Komponente benutzen möchtest, kannst Du die Unit ruhig umbauen [/edit]

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

 
Delphi 7 Personal
 
#27
  Alt 17. Nov 2004, 13:26
Oh, dass sie kommerziell, bzw. mit Popup ist habe ich nicht gesehen, in diesem Fall kommt sie für mich auch nicht in Frage.
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

 
Delphi 2010 Professional
 
#28
  Alt 18. Nov 2004, 15:11
Hi,

also ich wollte euch heute mal über den "Zwischenstatus" informieren. Also ich habe mal testweise implementiert, dass der Body der Funktionen auch geparsed wird, sodass man schauen kann, wo die Brackets anfangen und aufhören. Leider hat das bei diesem Versuch die Parsing Zeit meiner "Massendatei" (760 KB) von ~3500 ms auf ~6500 ms hochgejagt. Da werde ich mir noch etwas überlegen müssen. Ich baue daher in eigenen Klassen einen privaten Konstruktor ein, dem ich bereits fertige IMatch Ergebnisse übermitteln kann, sodass das nicht erneut in der DetermineEntityName() erledigt werden muss.
Derzeit bin ich auch noch dabei die Unterscheidung für <? ?> zu machen, damit man auch HTML Dokumente mit eingebettetem PHP richtig parsen kann.

Also am Wochende sollte das ganze das fertig sein (hoffe ich )

mfG
mirage228
David F.
  Mit Zitat antworten Zitat
DSeven
 
#29
  Alt 19. Nov 2004, 11:47
Guten Tag,

Das hört sich ja gut an, hoffe das du es schafst.
Freue mich schon auf den neuen release. Vor allem wegen <? ?>

mfg,
Nexis
  Mit Zitat antworten Zitat
DSeven
 
#30
  Alt 20. Nov 2004, 22:48
Guten Tag,

Ich hätte noch einen Verbesserungsvorschlag für deinen Parser:

Erstelle eine Klasse für die Includes die du von TPHPEntity ableitest.
Die klasse muss eigentlich nichts enthalten ich will nur überprüfen können ob es sich um ein Include handelt
zurzeit geht das ja nicht. Ich meine wenn ich auf ein Node im CodeBrowser zugreife.
Währe ganz nett wenn du das einbauen könntest. Ich wollte das eigentlich selber machen aber dann müsst ich bei allen
deinen neuen Version immer wieder dieses Feature selber einbauen. Deshalb ist es besser wenn du es selber zum Standart machst.

Es geht hier nur um die Bequemlichkeit, Zeit kostet das ja nicht.

mfg,
DSeven
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 23:20 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf