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 11 von 14   « Erste     91011 1213     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)
 
Benutzerbild von mirage228
mirage228

 
Delphi 2010 Professional
 
#101
  Alt 14. Mär 2005, 19:54
Zitat von DSeven:
Naja da hab ich es nicht so mit Regexe. Deswegen weis ich ja auch nicht wie sich das in deine Unit einbringen liesse weil mein Code ohne Regexe arbeitet. Aber er arbeitet ohne Fehler.
Kann sein das meine Methode auch ein wenig umständlich ist da ich zeichen für zeichen durchgehe. Aber eigentlich hab ich damit noch keine wirklichen probleme was speed oder funktionalität angeht.
Hm, kommt drauf an, wie Deine Methode optimiert ist, dann könnte sie ggf. ganz flott laufen.

Am besten baust Du die Suche danach direkt in den Programmblock nach "if FComments.CheckIsCommented(...) then" ein. Dann sind die Kommentare schon bis dahin geparsed und Du kannst Sie durchlaufen und ggf. die Daten hinzufügen.

mfG
mirage228
David F.
  Mit Zitat antworten Zitat
DSeven
 
#102
  Alt 14. Mär 2005, 20:19
Wie ist die unit aufgebaut. Werden alle Kommentare der unit gespeichert?

cya
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

 
Delphi 2010 Professional
 
#103
  Alt 14. Mär 2005, 20:45
Zitat von DSeven:
Wie ist die unit aufgebaut. Werden alle Kommentare der unit gespeichert?

cya
Also TPHPComments parsed die Kommentare nur wenn es durch die Funktionen "CheckIsCommented" oder "FullParse" gefordert wird. So wird das Parsen überflüssiger Kommentare verhindert.
Die Kommentare, wenn sie geparsed sind, werden von TPHPComments (in TPHPComment Objekten) gespeichert.

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

 
Delphi 2010 Professional
 
#104
  Alt 25. Mär 2005, 19:43
Hi,

so heute gibts wieder eine neue Version - 2.2

Neue Features gibts diesmal nicht, dafür habe ich einige Fehler behoben

Liste alle Änderungen:
  • Unnötigen Aufruf von ParseEntityData beim Setzen der SourceText Eigenschaft von TPHPSource entfernt.
  • Fehler behoben, dass wenn ein PHP Konstrukt auf mehrere PHP-Tag Paare verteilt war, es nicht erkannt wurde
  • Fehler beim Herausfinden der Basisklasse im PHP4-Only Modus behoben
  • TextPos Eigenschaft lieferte in einigen Fällen nicht korrekte Resultate (Die von TextPos angegebene Position war ein Zeichen vor der eigentlichen Position)

Den Download gibts wie immer im ersten Post.

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

 
Delphi 7 Personal
 
#105
  Alt 26. Mär 2005, 00:41
Hab die neue Version gerade mal heruntergeladen und kurz getestet
  Mit Zitat antworten Zitat
Benutzerbild von Pr0g
Pr0g

 
Delphi 7 Personal
 
#106
  Alt 26. Mär 2005, 22:22
Habe einen kleinen Fehler im Zusammenhang mit Konstanten gefunden. Öffne das Beispielprogramm und pack folgenden Code rein:
Code:
<?php

define('Test', 'a');   // Test = 'a
define('Test', 'aa');  // Test = aa
define('Test', 'aaa'); // Test = 'aaa
define('Test', 'aaaa'); // Test = aaaa
//...

?>
Hat der Wert der Konstante die Länge einer ungeraden Zahl, so wird vorne ein Anführungszeiche (ob einfach, oder doppelt hängt vom benutztem Zeichen in define() ab). Ist der Wert der Länge dagegen gerade, so wird keins angezeigt.

MfG Pr0g
  Mit Zitat antworten Zitat
Benutzerbild von Pr0g
Pr0g

 
Delphi 7 Personal
 
#107
  Alt 27. Mär 2005, 03:48
Und noch ein Fehler ist mir aufgefallen, der sich auf "include" und "require"(_once) bezieht. Steht einer dieser Befehle in der letzten Zeile, bspw. hier:
Code:
<?php
include
kommt es zu einer Zugriffsverletzung. Wenn sie nicht in der letzten Zeile stehen, so wie hier:
Code:
<?php
include
//leere Zeile
gibt es keine Probleme.

Edit: Bei folgendem Code wird der Text nach $to_require als Includedatei, bzw. require aufgenommen, das sollte ja nicht:
Code:
<?php
$to_require = 'meine_datei.php';
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

 
Delphi 2010 Professional
 
#108
  Alt 27. Mär 2005, 12:54
Hi pr0g,

Danke fürs Fehlersuchen.

Also der Fehler mit den define()s ist ja äußerst seltsam, sollte aber relativ einfach zu beheben sein - hoffe ich *g*.

Bei dem Include in der letzten Zeile habe ich lediglich vergessen einmal zu prüfen, ob der String länger ist als 0 Zeichen bevor ich versuche auf ein Zeichen zuzugreifen.

Aber der letzte Fehler hats wohl in sich. Man kann ihn, soweit ich das sehe, einfach durch das Hinzufügen einer Word Boundary (\b) Assertion nach dem "(?<!\$)" beheben, jedoch vergrößerte sich die Parsing-Zeit in meiner Testdatei (ca. 750 KB) von 2,7 Sek auf 3,3 Sek, was ich nicht besonders schön finde. Ich versuche das Problem noch anders in den Griff zu kriegen, aber wenns nicht anders geht, werde ich das wohl so mit dem \b machen.

Edit: Hab doch noch ne sehr einfache Lösung gefunden. Die Assertion (?<!\$) muss nur so angepasst werden, dass weder ein Alphanummerisches Zeichen, ein Unterstrich, noch ein $ oder ein sonstiges ASCII Zeichen, das einem Variablenbezeichner entsprechen kann, vor dem Match ist. Also einfach: (?<![\$\w\x7f-\xff])
In meinen Versuchen klappt das bisher sehr gut, also denke ich, mache ich das so. Bei dieser Variante gibts auch keine spürbaren Geschwindigkeitseinbußen

Wenn alles glatt geht, gibts heute eine neue bzw. eine aktualisierte Version.

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

 
Delphi 2010 Professional
 
#109
  Alt 27. Mär 2005, 16:01
Hi ho,

so die neue Version 2.3 ist fertig. Ich hoffe ich konnte alle Fehler zufriedendstellend behoben

Die neue Version enthält insgesamt folgende Änderungen:
  • Include-Dateien werden nicht mehr aufgeführt, falls kein Dateiname dahinter angegeben wird (wenn z.B. nur "include" schreibt)
  • Fehler behoben, dass Variablen fälschlicher Weise als Include-Dateien erkannt wurden (wenn man z.B. "$to_require = "file.php"" schrieb.)
  • Zugriffsverletzung behoben, die auftrat, wenn ein Include, Require, Include_Once oder Require_Once Befehl als letztes in einer Datei stand.
  • Fehler beim Parsen der Werte für Define()-Konstanten behoben
  • "placeholder" Methoden aus TPHPEntity und TPHPConstant entfernt (als "abstract" deklariert)

Der Download befindet sich wie gehabt im ersten Beitrag.

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

 
Delphi 7 Personal
 
#110
  Alt 27. Mär 2005, 16:51
Super, habs gerade getestet und scheint alles in Ordnung zu sein
  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 18:26 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