Sven: str_replace einzeilig

Hallo!

Ich lasse mir über POST eines Textfeldes vom User einen Quelltext übergeben den ich dann parse. Das klappt soweit ganz gut, doch kommt es aufgrund von Zeilenumbrüchen die nicht notwendig sind immer wieder zu dummen Fehlern (Tags werden nicht mehr als ganzes gefunden etc=.

Deshalb wäre es a praktisch den gesamten Quelltext zur Analyse in einer Zeile zu haben OHNE dabei zu vergessen, wo tatsächliche (vom User eingetippte) Zeilenumbrüche waren.

Wenn ich richtig informiert bin muss ich darfür etwas wie:

$output = preg_replace("!SUCHSTRING!s","ERSETZSTRING",$output);

benutzen oder? Kennt ihr bessere Alternativen? Das funktioniert irgentwie nicht immer >.<

  1. Hi,

    Wenn ich richtig informiert bin muss ich darfür etwas wie:

    $output = preg_replace("!SUCHSTRING!s","ERSETZSTRING",$output);

    benutzen oder?

    der Schalter /s sorgt nur dafür, dass das Pattern "." auch Umbruchzeichen mit einbezieht. Es kann gut möglich sein, dass exakt dies von Dir gewünscht ist; ungeachtet dessen ist ein String nur eine Ansammlung von Bytes, es gibt dort keine Zeilen. Entsprechend kann ein String auch nicht "in einer Zeile" sein.

    Kennt ihr bessere Alternativen?

    Besser in welcher Hinsicht?

    Das funktioniert irgentwie nicht immer >.<

    Dieser Versuch einer Fehlerbeschreibung funktioniert dahingegen _nie_. Ersetze ihn durch etwas, das eine Fehlerbeschreibung _ist_, und tausche dabei auch die Formulierung "nicht immer" durch eine Beschreibung aus, _wann_ das Problem auftritt. Welches auch immer es sein mag.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Kennt ihr bessere Alternativen?

      Besser in welcher Hinsicht?

      Das Problem war doch geschildert.. Ein Beispiel:

      In meiner Textbox sollte stehen:
      <gnargh stlye:normal>

      stattdessen findet man unter umständen (Wenn eben die Zeile zu kurz war):
      <gnargh
      style:normal>

      Wenn ich nun versuche <gnargh stlye:normal> mit str_replace durch etwas anderes zu ersetzen, scheitert der Verusch.

      1. Hi,

        Wenn ich nun versuche <gnargh stlye:normal> mit str_replace durch etwas anderes zu ersetzen, scheitert der Verusch.

        natürlich, str_replace() benötigt exakte Werte - schon bei "<gnargh  stlye:normal>" mit zwei Leerzeichen ist str_replace() nicht mehr nutzbar. Für Muster sind Regular Expressions zuständig. Wenn Du nun etwas besseres als das suchst, das Du selbst vorschlugst, müsstest Du spezifizieren, in welcher Hinsicht es besser sein soll.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. Hi,

          Wenn ich nun versuche <gnargh stlye:normal> mit str_replace durch etwas anderes zu ersetzen, scheitert der Verusch.

          natürlich, str_replace() benötigt exakte Werte - schon bei "<gnargh  stlye:normal>" mit zwei Leerzeichen ist str_replace() nicht mehr nutzbar. Für Muster sind Regular Expressions zuständig. Wenn Du nun etwas besseres als das suchst, das Du selbst vorschlugst, müsstest Du spezifizieren, in welcher Hinsicht es besser sein soll.

          Cheatah

          Etwas besseres war evtl falsch ausgedrückt, etwas funktionierendes trifft es eher. Das str_replace exakt arbeitet ist mir klar, doch eigentlich ist ja auch der zu Ersetzende Term exakt definiert (wären da eben nicht die neuen Zeilen).

          Die einzige Alternative die ich kenne wäre
          preg_replace("!<gnargh(.*?)stlye:normal>!s", "", $output). Aber das ist ja dann nicht mehr unbedingt exakt der Term den ich suche. Es geht mir tatsächlich nur um die Problematik, dass zu suchende Strings in verschiedenen Zeilen stehen und so für mich nichtmehr auffindbar sind.

          1. Hi,

            Das str_replace exakt arbeitet ist mir klar, doch eigentlich ist ja auch der zu Ersetzende Term exakt definiert (wären da eben nicht die neuen Zeilen).

            nein, er ist höchst unexakt definiert. Exakt wäre, wenn jedes einzelne Bit von vornherein bekannt ist. Hier weißt Du aber nicht nur nicht, ob ein Umbruch stattfindet oder ein Leerzeichen benutzt wird; Du weißt zudem nicht, aus welchen Zeichen der Umbruch besteht, oder wie viele Leerzeichen es sind, ob vor dem Umbruch noch Leerzeichen stehen, ob Tabulatoren benutzt werden und so weiter. Du hast ein Muster, keinen Vergleichs-String - und Muster schreien nach Regular Expressions.

            Die einzige Alternative die ich kenne wäre
            preg_replace("!<gnargh(.*?)stlye:normal>!s", "", $output). Aber das ist ja dann nicht mehr unbedingt exakt der Term den ich suche.

            Was gut ist, da Du ja nicht exakt den Term suchen willst.

            Es geht mir tatsächlich nur um die Problematik, dass zu suchende Strings in verschiedenen Zeilen stehen und so für mich nichtmehr auffindbar sind.

            Es geht Dir um die Problematik, dass *ähnliche* Strings mit bestimmbaren Unterschieden gleichermaßen gefunden werden sollen, ohne jede denkbare Kombination explizit nennen zu müssen. Dazu sind Regular Expressions geboren worden.

            Cheatah

            --
            X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
            X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
            X-Will-Answer-Email: No
            X-Please-Search-Archive-First: Absolutely Yes
            1. Die einzige Alternative die ich kenne wäre
              preg_replace("!<gnargh(.*?)stlye:normal>!s", "", $output). Aber das ist ja dann nicht mehr unbedingt exakt der Term den ich suche.

              Was gut ist, da Du ja nicht exakt den Term suchen willst.

              Doch, genau das ist die Anforderrung. Ich weiß das dort entweder ein Leerzeichen oder ein Umbruch ist. Wie ein Umbruch definiert ist weiß ich jedoch nicht (\n) ist es scheinbar nicht?). Wenn ich das obrige muster nehme könnten Informationen verschluckt werden. Ein Beispiel:

              <gnargh style:bold>TextText</ganrgh><gnargh stlye:normal>Blub</ganrgh>

              Bei Obigen Text würde nurnoch Blub</ganrgh> Übrig bleiben. Korrekt wäre ja aber <gnargh style:bold>TextText</ganrgh>Blub</ganrgh>

              Der einzige Vorteil des obigen Musters ist, dass die Zeilenumbrüche tatsächlich ignoriert werden.

              1. Hi,

                Doch, genau das ist die Anforderrung. Ich weiß das dort entweder ein Leerzeichen oder ein Umbruch ist. Wie ein Umbruch definiert ist weiß ich jedoch nicht (\n) ist es scheinbar nicht?).

                es ist in der Praxis entweder \n oder \r oder \r\n. Angeblich gab es früher auf sehr obskuren Systemen auch \n\r, aber diesen Fall würde ich vernachlässigen.

                Wenn ich das obrige muster nehme könnten Informationen verschluckt werden. Ein Beispiel:

                Das Stichwort lautet Greediness und ist leicht handhabbar. Die RegExp muss um ein einziges Fragezeichen ergänzt werden.

                Cheatah

                --
                X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
                X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
                X-Will-Answer-Email: No
                X-Please-Search-Archive-First: Absolutely Yes
              2. Was gut ist, da Du ja nicht exakt den Term suchen willst.

                Ich weiß das dort entweder ein Leerzeichen oder ein Umbruch ist. Wie ein Umbruch definiert ist weiß ich jedoch nicht (\n) ist es scheinbar nicht?).

                Na dann suche nach einem Leerzeichen oder Nichts und das über mehrere Zeilen.

              3. Hmm... /<gnargh\s+stlye:normal>/ funktioniert nicht?

  2. Auch wenn sich <del>das Äffchen</del><del>der Gepard</del><ins>der Betrüger</ins> rührend um eine Lösung des Problems kümmert, ist es dennoch ein Doppelposting.
    http://forum.de.selfhtml.org/my/?t=190041&m=1266156

    1. Hi,

      Auch wenn sich <del>das Äffchen</del><del>der Gepard</del><ins>der Betrüger</ins> rührend um eine Lösung des Problems kümmert, ist es dennoch ein Doppelposting.

      nur weil zwei Probleme im selben Zusammenhang auftreten, handelt es sich noch nicht um das selbe Problem. Ich sehe hier kein Doppelposting.

      http://forum.de.selfhtml.org/my/?t=190041&m=1266156

      Hast Du ein Script benutzt, um diesen Link zu erzeugen? Wenn ja, ist es kaputt.

      Cheatah

      --
      X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
      X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
      X-Will-Answer-Email: No
      X-Please-Search-Archive-First: Absolutely Yes
      1. http://forum.de.selfhtml.org/my/?t=190041&m=1266156

        Hast Du ein Script benutzt, um diesen Link zu erzeugen? Wenn ja, ist es kaputt.

        Ja, ich habe das JavaScript verwendet, welches hier im Forum zur Verfügung gestellt wird :)