Michael: preg_replace alles zwischen 2 Wörter ersetzen

Hallo Gemeinde,

ich bin hier am verzweifeln 😟

preg_replace("/#START#(.*)?#ENDE#/","",$datei);

Alles was zwischen #ANFANG# und #ENDE# ist soll gelöscht werden Die Rautezeichen sind Bestandteil der Wörter

In PHP will das einfach nicht funktionieren

Kann mir bitte jemand helfen ?

Danke Michael

  1. Hi,

    preg_replace("/#START#(.*)?#ENDE#/","",$datei);

    Alles was zwischen #ANFANG# und #ENDE# ist soll gelöscht werden

    dann sollte im Regex nicht #START# stehen, wenn #ANFANG# gemeint ist.

    Dein Code-Ausschnitt sieht so aus, als ob Du außerdem das Ergebnis der Ersetzung nicht weiterverwendest, der Rückgabewert von preg_replace wird ja nicht aufgefangen. Die Ersetzung findet also statt, aber das Ergebnis wird weggeworfen.

    cu,
    Andreas a/k/a MudGuard

  2. Tach!

    preg_replace("/#START#(.*)?#ENDE#/","",$datei);

    Alles was zwischen #ANFANG# und #ENDE# ist soll gelöscht werden

    Vermutlich ist der Inhalt der $datei mehrzeilig, da musst du den/die richtigen Modifier setzen, damit die Mehrzeiligkeit auch berücksichtigt wird, ansonsten wird der Text nur zeilenweise gefunden.

    dedlfix.

    1. Danke, genau daran hat es gelegen, das /s fehlte 😀

      Trotzdem will es wie erhoft nicht klappen

      $count = null;
      $returnValue = preg_replace('/#anfang#(.*)#ende#/s', '', 'test #anfang# 
      123456 
      
      #ende#
      12345
      #anfang#
      test
      #ende#', -1, $count);
      

      Ergebnis: "test "

      Ergebnis erwartet: "test 12345"

      was ist hier noch mein Gedankenfehler ?

      1. Tach!

        Trotzdem will es wie erhoft nicht klappen

        Das liegt an der Gierigkeit von regulären Ausdrücken. Ohne Ungreedy-Modifizierer nimmt ein Ausdruck alles zwischen dem ersten und dem letzten Vorkommen.

        dedlfix.

        1. Hallo dedlfix,

          Das liegt an der Gierigkeit von regulären Ausdrücken. Ohne Ungreedy-Modifizierer nimmt ein Ausdruck alles zwischen dem ersten und dem letzten Vorkommen.

          Ich find immer schade wenn, gerade bei so klar gelösten Fragen, keine Resonanz vom Fragesteller kommt damit zukünftige Leser wissen ob es geklappt hat. Ja du hast recht was greedy betrifft und als Ergänzung für andere Leser zum besseren Nachvollziehen: Hier

          Gruss
          Henry

  3. Hallo,

    wusste jetzt nicht ob ich dafür einen neuen Thread eröffnen sollte oder nicht...

    Ich nutze für solche Aufgaben, wie hier gefragt, meist einfache String-Funktionen anstelle Regex. Aus Neugierde wollte ich daher mal wissen wie es mit der Performance aussieht und habe ein paar Scripte von mir getestet. Nur, wie macht man das in der Regel? Ende-Anfang in mirotime(true). Das machts jetzt aber nicht wirklich verlässlich. Die Werte für ein und dasselbe Script schwanken extrem, was wohl damit zusammenhängt, was wie noch irgendwo im Speicher hängt oder sonst was.

    • Time = 0.0002751350402832
    • Time = 9.4175338745117E-5
    • Time = 6.0081481933594E-5
    • Time = 9.3936920166016E-5
    • Time = 0.0001530647277832
    • Time = 5.793571472168E-5
    • Time = 0.00010395050048828
    • Time = 9.4175338745117E-5
    • usw...

    Aber gibt es denn überhaupt eine ähnlich simple Vorgehensweise um die Laufzeit einigermaßen verlässlich zu ermitteln?

    Gruss
    Henry

    1. Tach!

      Aus Neugierde wollte ich daher mal wissen wie es mit der Performance aussieht und habe ein paar Scripte von mir getestet. Nur, wie macht man das in der Regel? Ende-Anfang in mirotime(true).

      Ja.

      Das machts jetzt aber nicht wirklich verlässlich. Die Werte für ein und dasselbe Script schwanken extrem, was wohl damit zusammenhängt, was wie noch irgendwo im Speicher hängt oder sonst was.

      Auch das. Multitasking-Systeme haben die Angewohnheit, mal zwischendurch ein Stück der anderen Prozesse abzuarbeiten.

      Aber gibt es denn überhaupt eine ähnlich simple Vorgehensweise um die Laufzeit einigermaßen verlässlich zu ermitteln?

      Nee, das Grundrauschen ist immer da und verfälscht die Messungen beliebig. Üblicherweise nimmt man mehrere Messungen vor und nimmt einen Mittelwert oder schätzt nach Augenmaß welcher Messwert einigermaßen repräsentativ ist. Auch lässt man den fraglichen Code gern in einer Schleife mehrmals ablaufen, damit er sich über das Grundrauschen hebt. Aber wenn man 10ⁿ Durchläufe braucht, um überhaupt was sinnvolles zu messen, im eigentlichen Anwendungsfall aber nur wenige Ausführungen hat, dann lohnt die Performance-Messung nicht, weil man den Unterschied sowieso nicht merkt. Man würde dann nur Mikrooptimierung betreiben.

      dedlfix.

    2. Hallo,

      die Werte für ein und dasselbe Script schwanken extrem,

      Findest du?

      • Time = 0.00027
      • Time = 9.4E-5
      • Time = 6.0E-5
      • Time = 9.3E-5
      • Time = 0.00015
      • Time = 5.79E-5
      • Time = 0.0001
      • Time = 9.4E-5
      • usw...

      Der größte Wert (der erste) ist etwa 5mal so groß wie der kleinste. Lässt man den raus, weil ab dem 2ten ein Cache-Effekt zu erwarten ist, sind wir bei einem Faktor 3.

      Ich seh keine extreme Schwankung.

      Gruß
      Kalk

    3. Die Werte für ein und dasselbe Script schwanken extrem, was wohl damit zusammenhängt, was wie noch irgendwo im Speicher hängt oder sonst was.

      • Time = 0.0002751350402832
      • Time = 9.4175338745117E-5
      • Time = 6.0081481933594E-5
      • Time = 9.3936920166016E-5
      • Time = 0.0001530647277832
      • Time = 5.793571472168E-5
      • Time = 0.00010395050048828
      • Time = 9.4175338745117E-5

      Wieso? So sehr schwanken die Werte doch gar nicht. (Beachte das "E-5"). Ansonsten spielen natürlich Dinge wie Cache des OS, aber eventuell (abhängig von Version, Betriebsart) das OpCode Caching eine Rolle.