Seite 1 von 4 1234 LetzteLetzte
Ergebnis 1 bis 10 von 32

Thema: [PHP] INI-Datei Parser

  1. #1
    Kaiser(in)
    Registriert seit
    29.03.2009
    Ort
    1011 1111 1011 WorldWideWeb
    Beiträge
    2.439
    Danke
    2
    Bekam 6 mal "Danke" in 6 Postings

    Standard [PHP] INI-Datei Parser

    Ich habe, aufgrund von anderem Verwendungszweck, einen relativ simplen Parser für INI-Dateien geschrieben. Der Syntax ist nicht ganz der, den man vielleicht kennt, aber ähnlich und beitet etwas mehr freiheiten.

    Key-Value paare werden mithilfe des = deklariert, jede anweisung trennt eine Zeile.
    Code:
    key=value
    key2=value
    Wird ein key doppelt definiert, wird der alte überschrieben.

    Zeieln können belibig eingerückt werden, leere Zeilen und die, die mit einem # beginnen, werden ignoriert. Ein # würde hier also ein KOmmentar bezeichnen.
    Code:
    key=value
    #key=value
    Bei den Sections liegt der größte unterschied. Denn, auch aus gründen des Codeverständinnes und der Vermeidung unnötiger kompliziertheit, muss deren Ende gekennzeichnet werden.

    Code:
    [section]
    key=value
    [END]
    Eine Section nicht zu beenden, endet in einer Exception.
    Sections können beliebig oft in einander verschalchtelt werden, es macht hier auch keinen unterschied, ob vor oder nach einer inneren section Key-Value paare stehen.
    Code:
    key=value
    [section1]
     key=value
     [section1.1]
      key=value
     [END]
     key2=value
     [section1.2]
      key=value
     [END]
    [END]
    Achtung: Die vielen key=value im oberen Beispiel überschreiben sich nicht.

    EDIT: Sorry, das hab ich vergessen:
    Achtung: Sections die doppelt definiert sind, werden ebenfalls überschrieben.

    Nun zu den freiheiten, von denen ich gesprochen habe: Ein = in einer anweisung ist nicht zwingen nötig. Somit kann man quasi listen definieren:

    Code:
    file_description=Produktliste
    [products]
     Computer
     Auto 
     Waschbecken
     Kugelschreiber
    [END]
    Soviel zum Syntax.

    Die Verwendung in PHP:

    Vom perser kommt ein Array zurück, das die Key-Value paare enthält. Sections sind ein Array mit gleichen beedingungen, wie das ausgangs-Array.
    Code:
    #userdata.ini
    name=Tobse
    [sprachen]
    Deutsch
    Englisch
    [END]
    PHP-Code:
    // je nachdem, wie man die Klasse an/ablegt
    include("INIParser.class.php");
    $file="userdata.ini";
    $user=INIParser::parseFile($file);
    echo 
    "Benutzername: ".$user["name"];
    echo 
    "Spricht folgende Sprachen: ".implode(","$user["sprachen"]); 
    um als Beispiel hier noch das Array, dass INI::parseFile zurück gibt aufzuzeigen:
    PHP-Code:
    Array (
        
    "name"=>"Tobse",
        
    "sprachen"=>Array (
            
    "Deutsch",
            
    "Englisch"
        
    )

    Zusätzlich zu INIParser::parseFile gibt es ncoh INIParser::parse. Diese Methode nimmt ein Array (oder einen String, den sie mithilfe von explode bei \n´s nach zeilen zeilt).
    Achtung: INIParser::parse und INIParser::parseFile sind statisch und INIParser abstrakt.


    Hier der Quellcode:
    PHP-Code:
    abstract class INIParser {
        public static function 
    parse($c) {
            if (
    gettype($c)!="array") {
                if (
    gettype($c)=="string") {
                    
    $c=explode("\n"$c);
                } else return 
    false;
            }
            
    $ar=array();
            
    $j=count($c);
            
    $line_nr=0;
            while (
    $line_nr<$j) {
                
    $line=trim($c[$line_nr]);
                if (
    substr($line01)=="#") {
                    
    $line_nr++;
                    continue;
                }
                if (empty(
    $line)) {
                    
    $line_nr++;
                    continue;
                }
                if (
    substr($line01)=="[" && substr($linestrlen($line)-1)=="]") {
                    
    $name=substr($line1strlen($line)-2);
                    
    $dept=0;
                    
    $end=false;
                    
    $n=$line_nr;
                    while (
    $n<$j) {
                        
    $line2=trim($c[$n]);
                        if (
    $line2=="[END]") {
                            
    $dept--;
                            if (
    $dept==0) {
                                
    $end=true;
                                break;
                            }
                        } else if (
    substr($line201)=="[" && substr($line2strlen($line2)-1)=="]") {
                            
    $dept++;
                        }
                        
    $n++;
                    }
                    if (
    $end===false) {
                        throw new 
    Exception("Unexpected end of section [".$name."] on line ".$j." in [parent]");
                    }
                    
    $sec=array_slice($c$line_nr+1$n-$line_nr-1);
                    
    $ar[$name]=INIParser::parse($sec);
                    
    $line_nr=$n;
                } else {
                    
    $pos=strpos($line"=");
                    if (
    $pos==false) {
                        
    $ar[]=trim($line);
                    } else {
                        @
    $ar[trim(substr($line0$pos))]=trim(substr($line$pos+1));
                    }
                }
                
    $line_nr++;
            }
            return 
    $ar;
        }
        public static function 
    parseFile($file) {
            return 
    self::parse(file($file));
        }

    Feedback herzlich willkommen, aber bitte Konstruktives.
    Achtung: Dies ist ein alter Thread im HTML und Webmaster Forum
    Diese Diskussion ist älter als 90 Tage. Die darin enthaltenen Informationen sind möglicherweise nicht mehr aktuell. Erstelle bitte zu deiner Frage ein neues Thema im Forum !!!!!
    Geändert von Tobse (07.05.2011 um 18:04 Uhr)
    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.
    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  2. #2
    Unregistriert
    Gast

    Standard AW: [PHP] INI-Datei Parser


  3. #3
    Großmeister(in)
    Registriert seit
    09.12.2008
    Ort
    Berlin
    Alter
    38
    Beiträge
    666
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings
    Blog-Einträge
    1

    Standard AW: [PHP] INI-Datei Parser

    Ich verstehe nicht ganz, wieso ich ein ini-File schreiben sollte, dass sich an Konventionen halten muss, die von einer spezifischen PHP-Klasse vorgegeben werden. Durch deine eigenen Konventionen geht die eventuelle Wiederverwendbarkeit in anderen Sprachen flöten. Also welchen Mehrwert bietet es mir ein ini-File zu schreiben, dass auf deine PHP-Klasse angewiesen ist und nichts weiter macht als mir ein assoziatives Array zu erstellen, statt einfach eine PHP-Datei zu erstellen in die ich direkt mein Array schreibe?
    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  4. #4
    Kaiser(in)
    Themenstarter

    Registriert seit
    29.03.2009
    Ort
    1011 1111 1011 WorldWideWeb
    Beiträge
    2.439
    Danke
    2
    Bekam 6 mal "Danke" in 6 Postings

    Standard AW: [PHP] INI-Datei Parser

    Wenn du z.B. in einem CMS einstellungsmöglichkeiten für erweiterungen bieten möchtest, dann ist ein ini file sicherer. Denn wenn du das in einer PHP-Datei ablegst, kann da ja sonst noch was für code drin sein. Ich habe das z.B. auch dazu verwendet, informationen zum Aussehen und inhalt von Fehlerseiten zu definieren (HTTP Status code, div. Farben und 2 Texte).

    Zum Beitrag von Unregistriert:
    Ja, ich weiss, dass es diese Funktion gibt. Allerdings war mir die 2te Sache mit den Sections wichtig, also das Array ohne keys. Auch finde ich es übersichtlicher, die Sections o aufzuteilen anstadt mit den punkten im namen.
    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.
    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  5. #5
    Unregistriert
    Gast

    Standard AW: [PHP] INI-Datei Parser

    Keine deiner Begründungen rechtfertigen deine Klasse und die vom Standard abweichende Ini-Datei.

  6. #6
    Großmeister(in)
    Registriert seit
    09.12.2008
    Ort
    Berlin
    Alter
    38
    Beiträge
    666
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings
    Blog-Einträge
    1

    Standard AW: [PHP] INI-Datei Parser

    ini-Dateien sind nach meiner Auffassung für Settings gedacht, nicht für Datenhaltung. Und ich lasse in meinen Systemen niemanden Settings festlegen und ini-Dateien anlegen, dem ich nicht auch weit genug vertraue um ihn php-Dateien anlegen zu lassen.
    Wenn es um Daten geht die von Außenstehenden eingepflegt werden, dann kriegen sie eine Web-Oberfläche über die sie das machen können, und ich entscheide in welcher Form ich die Daten ablege.

    Guck dir mal an wofür hier die ini-Datei verwendet wird:
    http://samuelsjoberg.com/archive/2007/01/url-dispatcher
    In so einer Form macht das schon wesentlich mehr Sinn für mich.
    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  7. #7
    Kaiser(in)
    Themenstarter

    Registriert seit
    29.03.2009
    Ort
    1011 1111 1011 WorldWideWeb
    Beiträge
    2.439
    Danke
    2
    Bekam 6 mal "Danke" in 6 Postings

    Standard AW: [PHP] INI-Datei Parser

    Dann eben Settings, es kann ja sein, dass es mehrer config.ini s (anstadt config.phps) gibt. Ein Interface für die Daten wäre zwar schön - allerdings, was wenn der Ausenstehende nicht bei jedem, der das verwendet, das interface konfigurieren kann.
    Wer die Klase verwenden will, soll, wer nicht, nicht.
    @Unregistriert: Ich muss mich hier in KEINER Weise rechtfertigen. Buntz es oder lass es sein.
    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.
    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  8. #8
    Unregistriert
    Gast

    Standard AW: [PHP] INI-Datei Parser

    Zitat Zitat von Tobse Beitrag anzeigen
    @Unregistriert: Ich muss mich hier in KEINER Weise rechtfertigen. Buntz es oder lass es sein.
    Habe ich auch nicht behaupter und ich lass es

  9. #9
    Großmeister(in)
    Registriert seit
    09.12.2008
    Ort
    Berlin
    Alter
    38
    Beiträge
    666
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings
    Blog-Einträge
    1

    Standard AW: [PHP] INI-Datei Parser

    Natürlich musst du dich nicht rechtfertigen, und meine Kritik ist auch keineswegs böse, sondern konstruktiv gemeint.

    Ich spreche mal nur von mir persönlich: Ich habe sicherlich über 90% meiner Klassen/Libraries die ich mir im Lauf der Jahre geschrieben habe mittlerweile verworfen und kann über das meiste davon nur noch den Kopf schütteln. Und so wird es dir auch mit deinem ini-Parser früher oder später gehen. Deine Klasse bietet nicht den geringsten Mehrwert gegenüber ini-Files die sich an die gängigen Konventionen halten, dafür aber mindestens einen enormen Nachteil, nämlich das diese ini-Files völlig auf deine PHP-Klasse angewiesen sind. Moderne professionelle Softwareentwicklung setzt aber voll auf Entkoppelung und Wiederverwendbarkeit der verschiedenen Elemente. Und da wird deine Klasse ein No-Go.
    Mach einen txt-Parser draus, dann kommen wenigstens keine Mißverständnisse auf. ini-Files haben nunmal (aus gutem Grund) Syntax-Konventionen. Und die über Bord zu werfen und somit jegliche Möglichkeit der Wiederverwendbarkeit zu eliminieren, einzig und allein aus dem Grund, weil dir persönlich eine andere Schreibweise besser gefällt, ist nichts was für die Allgemeinheit sonderlich interessant ist.

    Wie gesagt, das ist nicht böse sondern konstruktiv gemeint. Ich weiß deine Bereitschaft deine Codes der Allgemeinheit zur Verfügung zu stellen durchaus zu schätzen. Aber wer etwas veröffentlich muss auch das Feedback akzeptieren.
    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  10. #10
    Forum Guru Avatar von synaptic
    Registriert seit
    20.06.2007
    Ort
    Butzbach-Wiesental
    Beiträge
    10.901
    Danke
    45
    Bekam 48 mal "Danke" in 46 Postings
    Blog-Einträge
    1

    Standard AW: [PHP] INI-Datei Parser

    oder mach *.tobse files und nen tobse-parser

    dann weiß jeder dass ne config.tobse von deinem parser geparsed werden muss.. vielleicht erschaffst du ja so einen neuen standard
    KEIN support via pn, email, messenger oder falsch geposteten threads
    Futter für deine Schnuffelzwerge gibts bei den Schnuffelzwergen TOP Qualität, also klicken und kaufen

Ähnliche Themen

  1. anderen php parser verwenden
    Von jojo87 im Forum PHP Forum - Apache - CGI - Perl - JavaScript und Co.
    Antworten: 7
    Letzter Beitrag: 29.11.2009, 18:29
  2. XML-Parser verschluckt sich an Kaufmannsund
    Von vbtricks im Forum PHP Forum - Apache - CGI - Perl - JavaScript und Co.
    Antworten: 4
    Letzter Beitrag: 02.11.2009, 21:11
  3. [C++/Qt] Socket macht XML für den Parser unlesbar ...
    Von DarkSyranus im Forum Forum für alle anderen Programmiersprachen
    Antworten: 2
    Letzter Beitrag: 20.09.2009, 13:44
  4. Punkt vor Strich-Rechnung beim parser mit C#
    Von Aron im Forum Forum für alle anderen Programmiersprachen
    Antworten: 2
    Letzter Beitrag: 19.06.2009, 22:49
  5. Textinhalt einer html.datei aus einem andere datei aufrufen.
    Von redindian im Forum PHP Forum - Apache - CGI - Perl - JavaScript und Co.
    Antworten: 2
    Letzter Beitrag: 09.04.2007, 10:21

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •