• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

.ini-Datei editieren ohne Verlust der Kommentare

Status
Für weitere Antworten geschlossen.

dying_hero

Neues Mitglied
Hi,
für mein aktuelles Projekt benötige ich eine Klasse, mit der sich .ini-Dateien sowohl parsen als auch editieren lassen.

Bisher habe ich das immer gelöst, indem ich das Array aus der Funktion parse_ini_file() verändert und anschließend mit zwei foreach-Schleifen in einen String umgewandelt und in die Datei geschrieben habe.

Das Problem daran war, dass dabei immer die Kommentare verloren gingen.

Deswegen habe ich jetzt eine andere Vorgehensweise gewählt:
Alle veränderten Einstellungen werden in ein Array gespeichert, dann suche ich per Regexp nach den veränderten oder hinzugefügten Eigenschaften und weise ihnen die neuen Werte zu.

Die Werte im Array zu verändern, klappt natürlich einwandfrei (wäre ja auch ziemlich komisch, wenn nicht), aber sobald ich die Datei verändern will (bzw. zu Testzwecken im Moment nur einen String), passiert einfach gar nichts. Es wird kein Fehler gemeldet, aber die gewünschten Veränderungen werden nicht vorgenommen.

Ich vermute stark, dass es an den Regexp liegt, aber ich finde den Fehler nicht, zumal mich mich damit nicht sehr gut auskenne. Hier der Quellcode der Methode, die die Datei speichert:
PHP:
	public function saveIni()
	{
		$text = file_get_contents($this->ini_file);//Ini-Datei auslesen
		foreach($this->ini_last as $key=>$value)//Für jeden veränderten Wert
		{
			$text = preg_replace("!$key = (([0-9a-z]|\"|[#'./-_*]|\\)*))\n!Usi",
								 "$key = $value\n",
								 $text);//Wert ersetzen
		}
		echo "<b>" . nl2br($text) . "</b>";//Zu Testzwecken veränderten String ausgeben
	}
$this->ini_file steht logischerweise für den Dateinamen der .ini-Datei.
In $this->ini_last ist nur "test-ini"=>"b" abgespeichert. Die Test-Ini-Datei sieht folgendermaßen aus:
Code:
;zu Testzwecken nur eine einzige Einstellung
test-ini = a

Eigentlich soll das ganze den Wert von test-ini auf b ändern. Es erfolgt aber dennoch die Ausgabe test-ini = a.

Erkennt jemand, wo der Fehler liegt oder wüsste eine bessere Methode, in eine .ini-Datei zu schreiben, ohne das dabei die Kommentare verloren gehen? Ich wäre euch sehr dankbar.

MfG dying_hero
 
Werbung:
file_get_contents gibt die komplette file als string zurück, nicht als array, du suchst womöglich fopen.
 
Nein, sorry, da habe ich mich wohl falsch ausgedrückt. Ich habe den Array durch die Funktion parse_ini_file() im Konstruktor, der obige Teil der Klasse ist nur die Funktion, an der es hängt, wahrscheinlich am regulären Ausdruck.

Die anderen Arrays haben überprüftermaßen ihre Richtigkeit.

MfG
 
Werbung:
poste mal bitte alles, warum benutzt u eigentlich nicht wie jeder normale mensch ini_set ?
 
ini_set bewirkt einstellungen in der php.ini, hier geht es um eigen erzeugte ini dateien.

Ich habe mir mal etwas Gedanken gemacht und bin da auf die Idee gekommen die in etwa so aussieht:

Du liest die ini wirklich per file ein. Dadurch hast du nen array mit jeder zeile als eintrag.
Jetzt sortierst du jede zeile in andere arrays ein (Die Zeile nimmst du als key).
Und zwar sortierst du jetzt so, dass du in einem array die kommentare hast
in einem array die variablen und in einem anderen array leere zeilen, vlt noch ein array für sections
also in etwa so.
PHP:
//z.b kommentar in zeile 1
$comments[0] = ";inhalt der zeile";
//variable in zeile 2, 4
//den namen der variable nimmst hier auch wieder als key
$vars[1]["x"] = "bla";
$vars[3]["y"] = "bli";
//in zeile 3 ist z.b. ne leerzeile
$leer[2] = "is ja egal was hier drin steht, willst nur wissen obs $leer[2] gibt";
so kannst du nun mit dem richtigen auslesen wieder eine ini datei erzeugen, sähe dann so aus
Code:
;inhalt der zeile
x = bla 

y = bli
das problem kommt erst wenn soetwas kommt
Code:
varname = "varinhalt;mitsemikolon"
denn nun musst man erstmal rausbekommen ob es ein kommentar einleitet oder ein semikolon innerhalb der variable ist.
man kommt also durcheinander mit z.b.
Code:
varname = "varinhalt" ;kommentar
auch nicht so schlimm, da wenn das ; zur variable gehört diese zwangsläufig in "" stehen muss (sonst leitet es ja ein kommentar ein, was man ja dann nicht will).
dann stehst aber vor dem problem wenn sowas kommt
Code:
varname = "inhalt;der;var" ;kommentar mit "; im kommentar"

Du kommst also um ein paar komplexe Regeln nicht herum. Wenn man das aber mal geschafft hat, ist es ziemlich einfach wieder eine Config daraus zu erstellen die exakt der alten entspricht.

Ich werde mich morgen mal daran setzen und etwas rumprobieren und vlt ne klasse schreiben, finde das eine interessante aufgabe.

Grüße
 
Herzlichen Dank, vor allem an Frank. Interessante Idee, ist einen Versuch wert! Da leider mein Rechner geschrottet ist werde ich aber wohl nicht so bald dazu kommen;)

MfG dying_hero
 
Werbung:
Status
Für weitere Antworten geschlossen.
Zurück
Oben