• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Regex bestimmten Treffer ganz ersetzen

afoeder

New member
Hallo zusammen,

gibt es eine Möglichkeit, bei einem regex (mit PHP) beispielsweise den "dritten Treffer" wie er ist zu ersetzen?

Hintergrund: ich habe in einer Textdatei "Datensätze" drinstehen, die mit \n getrennt sind.
Wenn dann das Update vom "dritten Datensatz" ansteht, möchte ich mit z.B.

/(.+)(?:\r?\n|$)/

die einzelnen Datensätze matchen und schlicht sagen "ersetze den dritten Match durch ...

--> oder habt ihr eine bessere Idee?
Die komplette Datei neu schreiben möchte ich nicht, da ich nicht immer den kompletten Inhalt mitübertragen möchte, sondern wirklich nur die "Zeilennummer" und den neuen Wert.

(und voraussagend: an der Problemstellung ist nichts zu ändern; also gebt mir bitte keine "Tips" wie "mit einer Datenbank ginge das" usw...
Besten Dank!
Adrian
 
entweder PHP: preg_replace_callback - Manual und in der callback funktion mitzählen
oder den inhalt der datei einlesen, nach \n PHP: explode - Manual und dann die datensätze einzeln durchlaufen und da mitzählen

hm; das Explode wäre klar (obgleich ich dann lieber splitten und nach (\r?\n)+ trennen würde; aber das callback gefällt mir. Mit einer static-Variablen könnte ich dort mitzählen und dann das n-te Mal replacen... stimmt... allerdings muss ich dann sorgen, dass die Static-Variable wieder zurückgesetzt wird, falls ich die Funktion mehrmals verwenden möchte
(oder, das muss ich mal probieren, wenn ich die Funktion IM Callback aufrufe...)
OK,

danke soweit mal!

Adrian
 
solange du sicher bist dass die datensätze wirklich nur durch \n getrennt sind und keinen zeilenrückschub haben ist explode() schneller
 
Hihi :)
was "warum"? Warum das schneller ist?
http://de2.php.net/manual/en/function.preg-split.php schrieb:
If you don't need the power of regular expressions, you can choose faster (albeit simpler) alternatives like explode() or str_split().
..früher stand da mal noch, der Grund sei das nicht notwendige Anwerfen der Regex-Engine für das splitten.

--> Aber warum ich das mit split machen möchte: Weil ich nie wissen kann (und will) ob es nur \n sind oder vielleicht auch \r\n und ggf. noch trailing spaces oder so...
also \s*\r?\n wäre dann die Wahl.
 
warum denn file? ich will doch schreiben... :-/ ?

Du musst deine Textdatei ja trotzdem vorher lesen. Sonst kannst du nichts ersetzen. Und bevor du sie z.B. mit fopen() öffnest und dann nach Zeilenumbrüchen trennst, ist es einfacher file() zu nehmen. Das vereint die beiden Aufgaben.
 
Zurück
Oben