php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 08.08.2007, 22:38  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard Parserbau

Sagt mal, ich müssts eigentlich selbst wissen. Aber wie kann ich einen Lexer & Parser für eine simple Sprache bauen?
Weiß schon garnicht mehr wie ich anfangen kann.

Worums eigentlich geht:
Ich möchte über eine XML eine Website-Konfiguration ermöglichen, beispielsweise:
Code:
..
<error_reporting>E_ALL | E_STRICT</error_reporting>
..
Wie parse ich den Schlonz jetzt? Denn ohne das zu parsen, müsste ich wohl oder übel eval() verwenden, die Tür stände offen für Code-Injection. Ein unbeabsichtigt erzeugter Parse-Error wäre auch denkbar.
Ich könnte zwar mit get_defined_constants() und array_filter alle E_* Konstanten ermitteln, prüfen ob in dem Tag diese Konstanten plus erlaubte Zeichen | ^ & + vorkommen, aber einen Syntax-Error könnte man so trotzdem noch erzeugen.

Ideen? Eigentlich ist da ein Parser schon wieder oversized, aber vielleicht gibts ja eine schlanke Bibliothek, der man nur das Alphabet und ein paar bekannte Regeln übergeben muss und dann wird getestet. RegExp sind hier glaube ich nicht mächtig genug - oder?
Zergling-new ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 08.08.2007, 22:40  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

obwohl


explode nach | oder & oder +
erlaubte Elemente nun optional ^ mit nachfolgender E_* Konstante

aber das würde das konkrete Problem lösen, das abstrakte nicht, nämlich dass über XML bestimmte PHP-Flags gesetzt werden können. Bzw nicht nur Flags, das wäre ja einfach, sondern auch Werte.
Zergling-new ist offline   Mit Zitat antworten
Alt 08.08.2007, 22:53  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo Zergling,

wenn du schon xml-konforme Konfigurations-Files verwendest, kannst du das doch sehr einfach über bereits implementierte XML-Handler/-Parser erledigen.

Dazu einfach die XML-Datei einlesen und für definierte Knoten einen Handler oder eine Handler-Methode implementieren.

Was das XML angeht würde ich etwas anderes rangehen:

Code:
<root>
  <configuration>
    ..
    <configitem name="error_reporting">E_ALL | E_STRICT</configitem>
    <configitem name="session.save_path">/tmp</configitem>
    ..
  </configuration> 
</root>
Das ist IMHO generischer und vor allem leichter zu implementieren.

Sollte keine XML-Bibliothek zur Verfügung stellen, würde ich einen generischen HTML/XML-Tag-Parser implementieren, der dir aus bekannten Tags einen Objektbaum baut, den du dann anschließend abfragen kannst. Anregungen dazu gibts im Code meines Page-Controllers genügend...
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 08.08.2007, 23:19  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Und da tauchts wieder auf .. "generisch"

Kannst du mir ein kleines Beispiel geben? Kann das wirklich schon der XML-Parser erledigen? Über DTD dann?
Zergling-new ist offline   Mit Zitat antworten
Alt 09.08.2007, 17:10  
Erfahrener Benutzer
 
Registriert seit: 17.01.2006
Beiträge: 468
Slava
Standard

was spricht eigentlich gegen config.php
wo einfach
error_reporting(E_ALL | E_STRICT); steht?
oder ist das für dich zu einfach?
ich sehe kein grund PHP-einstellungen in xml abzuspeichern, da diese einstellungen so wieso nur PHP-Seitig interresant sind und haben für die andere Anwendungen keine bedeutung.
__________________
Slava
http://bituniverse.com
Slava ist offline   Mit Zitat antworten
Alt 09.08.2007, 17:29  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Ja, aber ich komme langsam davon weg, meine Website über den PHP-Code zu konfigurieren. Ich möchte sie über ein Webinterface konfigurieren, und seien es so elementare Einstellungen wie das error_reporting. Und da bietet sich XML nun mal an.
Zergling-new ist offline   Mit Zitat antworten
Alt 09.08.2007, 19:41  
Erfahrener Benutzer
 
Registriert seit: 17.01.2006
Beiträge: 468
Slava
Standard

nicht unbedingt.
über Webinterface kann man wunderbar die config.php Datei erzeigen als auch überschreiben und auslesen.
dabei reicht bei auslesen einfach file, trimm und explode funktionen.
Auch bei einstellung von configuration, die nicht so offt vorkommt brauchst du dir keine grosse sorgen um die Geschwindigkeit von eval() zu machen (wenn eval überhaupt benötigt wird).
du findest bestimmt ein paar Bibliotheken oder kannst auch eigener XML Parser entwickeln, aber du muss bedenken, dass dieser configurationsparser bei jedem Aufruf von deiner Hauptanwendung seine Arbeit erledigen muss, was in vergleich zu der einfacher include von config.php mit ein paar variablen, langsamer läuft.

Configdatei:
$errorlevel=E_ALL | E_STRICT;//const
$einevariable="wert";//string
$nocheine=3;//int
$etwas=4.6;//double
$was=FALSE;//bool
$ding=;//string blja blja blja
---------------
$pattern = '/\$([^\=]+)\=(.*);(\/\/(int|bool|const|string|double).*)?/';
preg_match_all($pattern, file_get_contents("config.php"), $array);
echo '<pre>', print_r($array, true), '</pre>';
gibt dir alle nötige informationen um die Variablen über ein formular behandeln zu können und danach auf grund von den Typen, die als kommentar stehen, richtig veränder und wieder in config.php abzuspeichern.

sorry, dass ich mit meinem Vorschlag kein direkter Antwort auf deine Frage gebe, aber ich meine, das erzeugen von phpscripten, die nur aus den variablen und den Werten besteht, ziemlich simpel ist und passt für die PHP anwendung viel besser, da die überflüssige Parsen von configurationen mit einer extra bibliothek nicht mehr gebraucht wird.
__________________
Slava
http://bituniverse.com
Slava ist offline   Mit Zitat antworten
Alt 09.08.2007, 20:00  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Das wäre schon möglich, aber das gefällt mir nicht so wirklich. Ich denke 20 KB sollten für ein Config-XML nicht zuviel sein. Aber notfalls werde ich es so cachen wie du vorgeschlagen hast. Vom Speed ist das zweifelsohne unschlagbar.
Zergling-new ist offline   Mit Zitat antworten
Alt 09.08.2007, 21:44  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Zitat:
Zitat von Zergling
Und da tauchts wieder auf .. "generisch"

Kannst du mir ein kleines Beispiel geben? Kann das wirklich schon der XML-Parser erledigen? Über DTD dann?
Tja, generisch ist eines meiner Lieblingswörter...

Ein Beispiel wäre meiner Ansicht nach folgendes (ungetestet):

PHP-Code:
<?php
$xmlDocument 
domxml_open_mem(file_get_contents('/path/to/my/config/file.ext'));
$configurationsNode =  &$xmlDocument->first_child();
$ChildNodes = &$configurationsNode->child_nodes();

foreach (
$ChildNodes as $Key => $Value){

     if(
$ChildNodes[$Key]->node_name() == configuration){

       
$ChildNodes[$Key]->node_value()

     }     

}
?>
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 09.08.2007, 23:28  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Ah verstehe, da ist was dran. Ich baue meinen Projektdummy allerdings grad doch noch etwas weitreichender um. Vorbild Ruby on Rails. Eine Development-, Test- und Production-Umgebung. Da muss die config.xml erstmal hintenanstehen, bis ich die Code-Generierung hab. Ziel ist hier auch in Test-Umgebungen alle assert()s drinzulassen, in der Entwicklung kommen sie natürlich raus, genauso wie Kommentare und Whitespaces. Herrje wenn ich dann noch die Konstanten selbst reinparsen könnte. Wow. Naja alles der Reihe nach.
Zergling-new ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

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 an
Gehe zu

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
parserbau, parser bau, php parser bauen, php parser entwickeln, parser implementieren, php boolean parser, php parse entwickeln, eigenen xml parser entwickeln, parser entwickeln, konstanten parsen php, lexer parser php locgical, php xml config error_reporting, parserbau grundlagen, parser generischer knoten, php erlaubte zeichen konstanten, mit php eval einen parser bauen, php assert eval(), parser bäume php boole, die konfigurationsdatei \config.xml\ ist nicht xml-konform., php bool parser

Alle Zeitangaben in WEZ +2. Es ist jetzt 21:29 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.