Best. Bereich aus Textdatei entfernen

schoko

Erfahrenes Mitglied
Hallo,

ich habe ein Problem mit dem löschen eines bestimmten Bereiches einer Textdatei.

Meine "Textdatei" (.htaccess) beinhaltet z.B. zweimal einen Dateischutz:
Code:
.htaccess-inhalt

<Files test.php>
require valid-user
</files>

<Files blabla.txt>
require valid.user
</files>
(roter Bereich soll entfernt werden, bzw. nicht geschrieben werden )

Mein Problem besteht nun darin, den kompletten Bereich zwischen den Tags <Files> und </files> zu löschen. Ich habe lediglich hinbekommen, die erste Zeile (<files test.php>) zu löschen. Jedoch weiß ich absolut nicht wie ich nun auch die anderen 2 löschen soll.

Das Problem ist, dass es ja nicht immer 2 Zeilen sind, es können ja genauso gut auch 3 oder 4 Zeilen sein, wenn zum Beispiel noch Gruppen usw. angegeben sind.

Hat vielleicht jemand einen Tip oder Denkanstoss für mich?

Vielen Dank schonmal!!

Grüße
schoko

**Edit**
Der zu löschende Block ist nicht immer der erste Block, es können beliebig viele davor oder dahinter stehen
**/Edit**
 
Zuletzt bearbeitet:
Wenn es immer der erste Files-Block sein soll, ließ die Datei über "file()" ein, nimm dir n boolean mit den du auf false setzt (z.b. $skip) und wenn du auf eine Zeile stößt, die mit "<files" anfängt, dann setzt du den auf true und sonst auf false.
Dann brauchst du nur noch das array durchzulaufen und jeweils mit unset alle zeilen löschen, während skip true ist ...
Oder du machst dir kein boolean sondern nen integer und zählst die files blöcke und filterst nicht auf true oder false, sondern auf eine bestimmte Nummer ... das hätte den Vorteil, dass du auch n Blöcke davor und dahinter haben kannst ...
 
Jo so wär es leicht, aber es ist leider nicht immer der erste Block, es kann genauso gut der 2., 3. oder 19. Block sein :)
 
In diesem Fall könnten reguläre Ausdrücke zum Einsatz kommen:
PHP:
$datei = '.htaccess';
file_put_contents($datei, preg_replace('@<Files test\.php>.*?</files>@si', '', file_get_contents($datei)));
Vorausgesetzt ist natürlich, dass die direktive genau diesen Wert („test.php“) hat.
 
Hm mein regulärer Ausdruck lautet nun so:

Code:
preg_match('<files'.$delrule.'>.*?</files>/si', $value)

preg_match ist für meine Zwecke besser als preg_replace...

Nun bekomme ich aber folgende Fehlermeldung:

Code:
Warning: preg_match(): Unknown modifier '.' in...

in $delrule steht z.b. test.php oder eben die Datei, dessen Block gelöscht werden soll.
 
Du hast meine Nachricht nicht genau gelesen ... ich hab doch gesagt, dass du auch statt nes Bools nen Int verwenden könntest und die Blockzahl eingeben kannst ... dann kannste ja auch auf das Abgleichen jeder Zeile statt "<files " "<files xxx.php>" nehmen...
 
Wieso möchtest du preg_match() verwenden, wenn doch ein Teil des Dateiinhalts gelöscht werden soll?

Mein Vorschlag:
PHP:
$filename = 'test.php';
file_put_contents('.htaccess', preg_replace('@<files '.preg_quote($filename).'>.*?</files>@si', '', file_get_contents('.htaccess')));
 
Ich hätte als Lösung die Datei komplett in eine Variable geladen.

Und diese dann per strstr() durchsucht bis sie auf <Files> stößt.
Dann eine 2. Suche bis </Files>.
Dann den Bereich dazwischen in eine neue Variable und dann der Replace im Dateiinhalt.

Hier mal grob der Code dafür:

PHP:
$dateiinalt = file()...
$anfang = strstr($dateiinhalt);
$ende = strstr($dateiinhalt);
$ende = substr($ende, 8); // 8 Zeichen weitergehen um an </Files> vorbeizukommen

$temp = str_replace($anfang, "", $dateiinhalt);
$temp = str_replace($ende, "", $temp);

$dateiinhalt = str_replace($temp, "" $dateiinhalt);

Sieht recht groß aus, die anderen 2 Zeieln Lösungen sind sicher besser.
Aber egal, habs nun mal gepostet :-)
 
@Gumbo:

Die Version von dir klappt leider nicht.

Den letzten Vorschlag schau ich mir nun mal genauer an.

Danke
 
Also bei mir funktioniert mein Vorschlag ausgezeichnet. Was genau funktioniert denn nicht? Gibt es eine Fehlermeldung?
 
Zurück