fgets, fputs und ereg oder ereg_replace
romy
- php
Hi,
habe mich bis jetzt noch nicht so sehr mit filehandling und regular Expressions beschäftigt, muss jetzt aber mal ran.
Vielleicht hat ja jemand einen kleinen Denkanstoss für mich.
also:
ich habe eine Datei.php
und ich möchte ein Funktion schreiben, die
1. die Datei öffnet
2. durchsucht nach einem bestimmten String
3. diesen ersetzt
4. die Datei wieder schliesst
so habe ich angefangen:
function setTarget($filename) {
if(file_exists($filename)) {
$handle = fopen($filename,"r+");
while($line = fgets($handle)) {
if(ereg("???",$line)) {
}
}
fclose($handle);
}
}
sollte ich jetzt besser ereg nehemen und dann wieder fputs, oder gleich ereg_replace.
Und ich habe immense Schwierigkeiten mit dem Ausdruck, der in die ereg-Anweisung reingehört.
der zu suchende String sieht so aus:
setLink("blabla","blabla","balal","blaal");
der zu Ersetzende:
setLink("blabla","blabla","balal","blaal",1);
danke
ciao
romy
Hi Romy,
ich würde für dein Vorhaben nicht die Datei zeilenweise einlesen, sondern in einer Variablen speichern - z.B: so:
// Einlesen in String test
$test = implode("", file("datei"));
danach kannst du auf diese Variable einen RegExp zum Ersetzen anwenden - du solltest nicht ereg_replace nehmen, sondern die PCRE denn diese sind schneller http://www.dclp-faq.de/q/q-regexp-ereg.html
Für deine Zwecke geeignet ist: preg_replace(); http://de3.php.net/manual/en/function.preg-replace.php
Danach schreibst du den Inhalt der Variablen zurück in die Datei.
Wenn deine Datei nicht wahnnsinnig gross ist sollte es so funktionieren - ist sie es doch würde ich bei häufigeren Ersetzungen zu einer Rel. Datenbank raten..
Gruss Sven
Hi Sven
ich habe es probiert, bekomme jedoch diese Fehlermeldung.
Warning: Compilation failed: unmatched parentheses at offset 9 in includes/func.inc.php on line 8
was bedeutet die
meine Funktion sieht so aus:
function setTarget($filename,$i) {
if(file_exists($filename)) {
$test = implode("", file($filename));
$pattern = "[,$version)]";
$replacement = ",$version,".$i.")";
$test = preg_replace($pattern,$replacement,$test);
}
return $test;
}
ich hoffe Du entschuldigst, wenn es wenig professionell aussieht, habe noch keine Ahnung von regualr expressions.
danke
romy
Hi Romy!
ich hoffe Du entschuldigst, wenn es wenig professionell aussieht, habe noch keine Ahnung von regualr expressions.
Ich hoffe du entschuldigst, dass ich erst jetzt antworte ;) - war mal offline...
$pattern = "[,$version)]";
Bei den PCRE Perl Compatible Reg. Expr. sehen die Patterns etwas anders aus - eben wie in Perl und nicht nach POSIX-Standard, deshalb hatte ich dir den Link mit geschickt: schau mal hier nach:
http://selfhtml.teamone.de/cgiperl/sprache/regexpr.htm#zeichenketten ;)
http://www.php-center.de/de-html-manual/ref.pcre.html
Gruss Sven
Hi,
hab rausgefunden was dass Problem war. Aber der link war nicht schlecht um sich mal ein bisschen daran zu gewöhnen.
Bin leider noch nicht wirklich vorwärts gekommen.
Ich möchte das die Datei ansich nicht für immer verändert wird sondern nur indem Moment Dies erreiche ich ja indem ich nur den String verändere ABER: wie krieg ich den dann zu ausführen? mit eval();
Ausserdem wird trotz meiner Funktion nichts verändert, dass Ganze sieht jetzt so aus:
function setTarget($filename,$i) {
if(file_exists($filename)) {
$test = implode("", file($filename));
$pattern = "/$version)/";
$replacement = "$version,".$i.")";
$test = preg_replace($pattern,$replacement,$test);
}
return $test;
}
wenn ich test in einer textarea ausgeben lassen, sehe ich dass nichts verändert wurde (ich vermute, weil er das pattern nicht findet)
(Habe es mit einem anderen Beispiel ausprobiert da funktioniert es Problemlos)
das zu findende:
echo setLink("info.php", "[ Info ]", "text_winlike", $version);
er soll also noch einen weiteren Parameter hinzufügen. Hast Du noch eine Idee?
danke für Deine Mühe (ich bin leider Abends nicht online udn hoffe Du liesst es trotzdem)
ciao
romy