PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : mit regulärem ausdruck variable ändern


scraddy
29.07.2009, 12:22:50
hallo comm,

ich stehe gerade etwas auf dem schlauch, was einen regulären ausdruck angeht. folgende situation:

es gibt eine datei settings.php:
<?php
$SETTINGS['show_after_login'] = 0;
$SETTINGS['font_size'] = 1;
$SETTINGS['number_of_rows'] = 50;
?>

ich habe nun vor in dieser datei die werte der variablen zu ändern. dazu möchte ich gerne preg_replace verwenden.

$settings_file = preg_replace("#(\$SETTINGS\['font_size'\].?\=.?).*(;)#", "$1".$wert."$2", $settings_file);


in die variable $settings_file wurde vorher die datei per get_file_contents geladen.

leider funktioniert das so nicht. vielleicht kann mir einer von euch sagen, wie man soetwas am besten macht. danke schonmal

gruß, markus

DokuLeseHemmung
29.07.2009, 12:34:53
Der falsche Weg...

Warum?
1. du verwendest (scheinbar) globale Variablen.
2. selbstmodifizierender Code hat so seine eigenen Probleme(Tücken)
4. es gibt "schönere" Methoden konfigurationen zu bearbeiten

ini oder xml Dateien
Wenn du auf dein $SETTINGS beharren möchtest, dann gibts auch noch var_export()


PS:
Eigene Variablen schreibt man klein

scraddy
29.07.2009, 13:17:59
danke für die schnelle und aussagekräftige antwort.

ich hatte schon gelesen, dass php extra funktionen für ini dateien bereit stellt.
ok, eigene variablen schreibt man klein, das habe ich auch schonmal gehört.

in diesem fall habe ich es mir etwas bei dem cms redaxo abgeschaut ;-).

naja, es ist eine art pseudo globale variable. da die datei, die die variable definiert, am anfang der index included wird, kann man das so sehen.

ich habe mich schon durch etliche google-suchergebnisseiten gewühlt, aber leider nichts über die "schönen methoden" gefunden. kennst du eine schöne methode um solche werte zu speichern?

sonst werde ich wohl doch zu einer xml-datei greifen, weil mir das am einfachsten erscheint, dank simplexml.

ich denke solche werte in einer zeile einer datenbanktabelle zu speichern ist auch overkill, oder?

DokuLeseHemmung
29.07.2009, 13:35:22
Ich habe in meiner Gabbelkiste eine Klasse, welche das Registry Design Pattern implementiert. Evtl. kannst du dir da ja was abschauen...


class ConfigArrayFile
{
protected $file = null;
protected $data = array();
protected $autosave = true;

public function __construct($file, $autosave = true)
{
$this->file = $file;
$this->autosave = $autosave;
if(file_exists($this->file))
$this->data = include $this->file;
if(!is_array($this->data))
throw new Exception('Die Konfigurationsdatei liefert kein Array!');
}
public function save()
{
$daten = var_export($this->data,true);
$content = '<'."?php return $daten ?".'>';
$erfolg = file_put_contents($this->file,$content);
if(false === $erfolg)
throw new Exception('Die Konfigurationsdatei konnte nicht geschrieben werden!');
}

public function __isset($key)
{
return array_key_exists($key,$this->data);
}

public function __unset($key)
{
unset($this->data[$key]);
if($this->autosave) $this->save();
}

public function __set($key,$value)
{
$this->data[$key]=$value;
if($this->autosave) $this->save();
}

public function __get($key)
{
if(array_key_exists($key,$this->data))
return $this->data[$key];
throw new Exception("Key: $key nicht gefunden!");
}

}




// testcode

$registry = new ConfigArrayFile('./konfigurationsdaten.php');

$registry->kuchen = 'Zwiebelkuchen';
$registry->tier = 'Frosch';


if(isset($registry->kuchen)) echo $registry->kuchen.'<br>';
unset($registry->kuchen);
if(isset($registry->kuchen)) echo $registry->kuchen.'<br>';


Der Umbau auf SimpleXML sollte problemlos machbar sein.

Achtung:
Wenn viele Prozesse gleichzeitig ändern, ist mit Race Condtions zu rechnen.

scraddy
29.07.2009, 16:08:36
danke!