tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
12
ZUGRIFFE
538
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    schoko schoko ist offline Mitglied Gold
    Registriert seit
    Feb 2002
    Beiträge
    159
    Hallo,

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

    Meine "Textdatei" (.htaccess) beinhaltet z.B. zweimal einen Dateischutz:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    .htaccess-inhalt
     
    [color=red]<Files test.php>
    require valid-user
    </files>[/color]
     
    <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**
    Geändert von schoko (26.07.06 um 09:32 Uhr)
     

  2. #2
    Avatar von Divi
    Divi Divi ist offline Mitglied Gold
    Registriert seit
    Aug 2004
    Beiträge
    238
    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 ...
     

  3. #3
    schoko schoko ist offline Mitglied Gold
    Registriert seit
    Feb 2002
    Beiträge
    159
    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
     

  4. #4
    Registriert seit
    Dec 2002
    Ort
    Trier
    Beiträge
    17.502
    Blog-Einträge
    10
    In diesem Fall könnten reguläre Ausdrücke zum Einsatz kommen:
    PHP-Code:
    $datei '.htaccess';
    file_put_contents($dateipreg_replace('@<Files test\.php>.*?</files>@si'''file_get_contents($datei))); 
    Vorausgesetzt ist natürlich, dass die direktive genau diesen Wert („test.php“) hat.
     
    Markus Wulftange

  5. #5
    schoko schoko ist offline Mitglied Gold
    Registriert seit
    Feb 2002
    Beiträge
    159
    Hm mein regulärer Ausdruck lautet nun so:

    Code :
    1
    
    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 :
    1
    
    Warning: preg_match(): Unknown modifier '.' in...

    in $delrule steht z.b. test.php oder eben die Datei, dessen Block gelöscht werden soll.
     

  6. #6
    Avatar von Divi
    Divi Divi ist offline Mitglied Gold
    Registriert seit
    Aug 2004
    Beiträge
    238
    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...
     

  7. #7
    Registriert seit
    Dec 2002
    Ort
    Trier
    Beiträge
    17.502
    Blog-Einträge
    10
    Wieso möchtest du preg_match() verwenden, wenn doch ein Teil des Dateiinhalts gelöscht werden soll?

    Mein Vorschlag:
    PHP-Code:
    $filename 'test.php';
    file_put_contents('.htaccess'preg_replace('@<files '.preg_quote($filename).'>.*?</files>@si'''file_get_contents('.htaccess'))); 
     
    Markus Wulftange

  8. #8
    Avatar von fiacyberz
    fiacyberz fiacyberz ist offline Mitglied Brokat
    Registriert seit
    Aug 2001
    Ort
    Hamburg
    Beiträge
    446
    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-Code:
    $dateiinalt file()...
    $anfang strstr($dateiinhalt);
    $ende strstr($dateiinhalt);
    $ende substr($ende8); // 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
     

  9. #9
    schoko schoko ist offline Mitglied Gold
    Registriert seit
    Feb 2002
    Beiträge
    159
    @Gumbo:

    Die Version von dir klappt leider nicht.

    Den letzten Vorschlag schau ich mir nun mal genauer an.

    Danke
     

  10. #10
    Registriert seit
    Dec 2002
    Ort
    Trier
    Beiträge
    17.502
    Blog-Einträge
    10
    Also bei mir funktioniert mein Vorschlag ausgezeichnet. Was genau funktioniert denn nicht? Gibt es eine Fehlermeldung?
     
    Markus Wulftange

  11. #11
    schoko schoko ist offline Mitglied Gold
    Registriert seit
    Feb 2002
    Beiträge
    159
    Keine Fehlermeldung...es passiert gar nichts, die Datei ist nach dem ausführen der Funktion genauso wie vorher...unverändert...
     

  12. #12
    schoko schoko ist offline Mitglied Gold
    Registriert seit
    Feb 2002
    Beiträge
    159
    OK es klappt!! Hab meinen Fehler gefunden, ich hatte bei der Übergabe von $delrule ein Leerzeichen vorgesetzt also: " test.php".
    Deswegen klappte der RegEx nicht da ein Leerzeichen zuviel drin war. Habs nun korrigiert und es klappt alles wunderbar!

    Danke Gumbo
    und danke allen anderen !!

    Gruß
    schoko
     

  13. #13
    Avatar von Dr Dau
    Dr Dau Dr Dau ist offline ich wisch hier durch
    Registriert seit
    Feb 2005
    Ort
    hinterm Mond gleich Links
    Beiträge
    6.160
    Blog-Einträge
    4
    Hallo!
    Zitat Zitat von schoko
    Hab meinen Fehler gefunden, ich hatte bei der Übergabe von $delrule ein Leerzeichen vorgesetzt also: " test.php".
    Ich kenne Leute die zum löschen eines Textes diesen markieren und dann einfach die Leertaste drücken.
    Anschliessend schreiben sie ganz normal weiter.
    Dadurch haben sie auch immer ein Leerzeichen am Anfang.
    Mit trim() kannst Du hier Abhilfe schaffen.

    Gruss Dr Dau
     
    Schri-Schra-Schrödi *g*
    mehrspaltiges/zeiliges Seitenlayout mit DIV's und CSS
    Dinge, die mit Tabellen besser klappen als mit CSS
    Ausgabe von Datum/Zeit unabhängig von der Server Zeitzone [php]
    Meine Links zum Thema Linux (Last update: 29.10.2011)
    Kein Busen ist so flach wie das Niveau dieser Party!
    ----
    Alte Weisheit: wer uns in den Arsch kriecht wird beschissen!
    ----
    Ich habe 3 Kinder und kein Geld!
    Warum kann ich nicht keine Kinder haben und 3 Geld?! (Homer Jay Simpson)

Ähnliche Themen

  1. Leerzeilen aus Textdatei entfernen
    Von BruS im Forum Visual Basic 6.0
    Antworten: 7
    Letzter Beitrag: 01.03.10, 20:53
  2. vbLf aus einer Textdatei entfernen
    Von nero-15 im Forum .NET Windows Forms
    Antworten: 3
    Letzter Beitrag: 23.02.08, 20:00
  3. Antworten: 1
    Letzter Beitrag: 25.07.06, 09:40
  4. Überstehenden Bereich abtrennen/entfernen
    Von Suicider9184 im Forum Vektor-Programme
    Antworten: 4
    Letzter Beitrag: 21.09.05, 12:46
  5. Textteil aus Textdatei Inhalt entfernen
    Von JFranz im Forum PHP
    Antworten: 2
    Letzter Beitrag: 04.11.04, 22:00