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 7 von 14   « Erste     567 89     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 Pr0g
Pr0g

 
Delphi 7 Personal
 
#61
  Alt 5. Dez 2004, 16:01
Super, funktioniert
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

 
Delphi 2010 Professional
 
#62
  Alt 5. Dez 2004, 16:03
Zitat von Pr0g:
Super, funktioniert
Hi,

ersetze zusätzlich die Zeilen um Nr. 1586 durch dies:
Delphi-Quellcode:
FIncludes.Add(TPHPIncludeFile.Create(Self,
  MatchColl2.Items[i].Value, MatchColl2.Items[i].Index +
  Index + 1)); // + 1 !
, damit der Index der Includes wieder richtig ist ... oder du lädst das neue Archiv runter

mfG
mirage228
David F.
  Mit Zitat antworten Zitat
DSeven
 
#63
  Alt 5. Dez 2004, 22:52
Guten Tag,

mir gefält die neue Version eigentlich ganz gut.
Aber wollte noch anmerken das es konstanten ohne Klassenbezug gibt die ja momentan nicht erkannt werden.

mfg,
DSeven
  Mit Zitat antworten Zitat
DSeven
 
#64
  Alt 5. Dez 2004, 23:10
Guten Tag,

Also bei mir gibt er wenn ich folgendes aufrufe:

phpParser.FindEntityAt(ActiveEdit.Editor.SelStart).Occurence; Immer die Klasse zurück. Naja ok bei der ersten Klasse gibt er mir wenn ich in einer funktion bin die Funktion zurück aber aber der zweiten klasse gibt er mir die klasse zurück. Warum?

Ahja und bei mir funktionieren die konstanten nicht habe sie wie folgt deklariert:
Code:
class Foo {
     const konstante = "Konstante";
}
Aber die Konstante wird nicht erkannt.
Edit: Habe Fehler gefunden, " wird nicht erkannt wenn man ' benutzt geht es. muss behoben werden.

mfg,
DSeven
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

 
Delphi 2010 Professional
 
#65
  Alt 6. Dez 2004, 06:29
Hi,

Zitat von DSeven:
mir gefält die neue Version eigentlich ganz gut.
Danke - Aber jetzt kommt wohl das "aber" *g*

Zitat von DSeven:
Aber wollte noch anmerken das es konstanten ohne Klassenbezug gibt die ja momentan nicht erkannt werden.
Hm... Also im PHP Manual steht:
Zitat von PHP Manual:
It is possible to define constant values on a per-class basis [...]
Also gibt es Konstanten imho nur innerhalb einer Klasse - nicht global.

Zitat von DSeven:
Ahja und bei mir funktionieren die konstanten nicht habe sie wie folgt deklariert:

Delphi-Quellcode:
class Foo {
    const konstante = "Konstante";
}
Aber die Konstante wird nicht erkannt.
Edit: Habe Fehler gefunden, " wird nicht erkannt wenn man ' benutzt geht es. muss behoben werden.
Ups , da haste aber recht. Habe die Deklaration im PHP Manual gelesen und dachte es würden nur normale Hochkommata angenommen. Naja, aber das zu beheben, sollte kein großes Problem sein

Zitat von DSeven:
Also bei mir gibt er wenn ich folgendes aufrufe:

phpParser.FindEntityAt(ActiveEdit.Editor.SelStart).Occurence; Immer die Klasse zurück. Naja ok bei der ersten Klasse gibt er mir wenn ich in einer funktion bin die Funktion zurück aber aber der zweiten klasse gibt er mir die klasse zurück. Warum?
Also da scheint es ein Problem mit dem FindEntityCode zu geben. Es wird nur die Klasse selbst zurückgegeben, falls der Cursor in der Klasse, aber bei keiner Konstante, Variable oder Funktion ist.
Ich werde mir das ganze nochmal zu Gemüte führen müssen ...

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

 
Delphi 7 Personal
 
#66
  Alt 6. Dez 2004, 15:32
Mir ist auch noch was aufgefallen. Wenn man nach einem Includebefehl das Semikolon mehrere Zeilen nach unten schiebt, so werden die Zeilenumbrüche (als schwarze Striche) mit aufgeführt:
Code:
<?php

  //Includetest
  include('test.php')


;
?>
Ist das Semikolon nicht vorhanden, wird einach das des nächsten Befehls genutzt, auch hier stimmt die Ausgabe dann wieder nicht. Vielleicht solltest du das Semikolon nur zur Überprüfung der Vorllständigkeit nutzen, oder so, hier jedenfalls der Code:
Code:
<?php

  //Includetest
  include('aaa')
  include('test2.php');

?>
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

 
Delphi 2010 Professional
 
#67
  Alt 6. Dez 2004, 16:11
Zitat von Pr0g:
Mir ist auch noch was aufgefallen. Wenn man nach einem Includebefehl das Semikolon mehrere Zeilen nach unten schiebt, so werden die Zeilenumbrüche (als schwarze Striche) mit aufgeführt:
Code:
<?php

  //Includetest
  include('test.php')


;
?>
Ist das Semikolon nicht vorhanden, wird einach das des nächsten Befehls genutzt, auch hier stimmt die Ausgabe dann wieder nicht. Vielleicht solltest du das Semikolon nur zur Überprüfung der Vorllständigkeit nutzen, oder so, hier jedenfalls der Code:
Code:
<?php

  //Includetest
  include('aaa')
  include('test2.php');

?>
Hi,

Ok, das erste ist nen Fehler. Den kannst Du fürs erste beheben, indem Du im RegEx-String ein (\s*) vor das Semikolon packst.

Das zweite hingegen ist syntaktisch nicht korrekt (wird auch von PHP bemängelt) - da muss ich schauen ob und wie ich das löse

Die neue Version kommt, denke ich, heute abend noch, da ich den Fehler im FindEntityAt() Code und bei den Konstanten auch schon behoben habe.

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

 
Delphi 7 Personal
 
#68
  Alt 6. Dez 2004, 16:16
Zitat von mirage228:
Das zweite hingegen ist syntaktisch nicht korrekt (wird auch von PHP bemängelt) - da muss ich schauen ob und wie ich das löse
Das Stimmt zwar, aber der User kann ja auch mal eine Fehleingabe machen und dann sollte er trotzdem keine fehlerhafte Ausgabe sehen, so ist das gemeint.
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

 
Delphi 2010 Professional
 
#69
  Alt 6. Dez 2004, 18:11
Zitat von Pr0g:
Zitat von mirage228:
Das zweite hingegen ist syntaktisch nicht korrekt (wird auch von PHP bemängelt) - da muss ich schauen ob und wie ich das löse
Das Stimmt zwar, aber der User kann ja auch mal eine Fehleingabe machen und dann sollte er trotzdem keine fehlerhafte Ausgabe sehen, so ist das gemeint.
Hi,

Ich könnte Dir folgenden "Kompromiss" anbieten:

Ein Include-String wird gemachted, falls die Suchwörter (include etc.) gefunden wurden und für den Rest die folgenden Bedingungen zu treffen.
  • Im darauffolgenden String taucht eine ) auf (Achtung: Falls es mitten im String ist, würde nur bis dahin gematched!)
  • Am Ende snytaktisch korrekt das ; steht. (Diese Variante hätte Vorrang beim Matchen!)

Andernfalls wäre der Match negativ.

Edit: Das Ganze geht natürlich auf Kosten der Zeit. Daher weiss ich nicht, ob es sich lohnt.

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

 
Delphi 7 Personal
 
#70
  Alt 6. Dez 2004, 18:44
DSeven scheint ja auch Interesse an dem Projekt zu haben, vielleicht sagt er dazu noch was. Wenns zu sehr auf die Zeit geht, dann lass es erstmal so.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 7 von 14   « Erste     567 89     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 07:01 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