sunny: Bestimmten String mit Zeilenumbrüchen finden und ersetzen? Wie?

Hallo,

momentan versuche ich per PHP gewisse Strings zu ersetzen um sie ordentlich in eine DB zu bekommen, habe nun aber ein Problem mit Zeilenumbrüchen.

Es gibt viele Strings in welchen zB folgende Zeichenfolge vorkommt:

[...] Teil des Strings <br/>[Zeilenumbruch]
<br/>
Dann geht es weiter <br/>[Zeilenumbruch]
<br/>
[...]

Diese doppelten LineBreaks sollen verschwinden und durch p-Tags ersetzt werden. Ich weiß aber leider nicht genau, wie ich das anstellen soll.

Da auch andere Dinge gesucht und ersetzt werden habe ich ein Array angelegt mit den Suchmustern, und möchte da jetzt eben auch diese Zeilenumbruch-Geschicht reinbekommen.

Versucht habe ich das zB so:

  
$Patterns[5] = "/<br \/>  
<br \/>/";  
[...]  
  
$Replacements[5] = "</p><p>";  
[...]  
  
ksort($Patterns);  
ksort($Replacements);  

Das funktioniert sogar, allerdings ist das wohl nicht gerade die sicherste Methode, das kann man doch besser lösen als einfach einen im Pattern auch einen Zeilenumbruch zu setzen? Zumal es momentan auch nur auf dem Testserver funktioniert ...

Dann hätte ich es noch mit "/<br />\n<br />/" versucht, das hat aber gar nicht geklappt.

Hat jemand einen Tip für mich wo ich hierzu eine Lösung finden kann oder wie man das korrekt bewerkstelligt?

Liebe Grüße
sunny

  1. Hallo sunny.

    momentan versuche ich per PHP gewisse Strings zu ersetzen um sie ordentlich in eine DB zu bekommen, habe nun aber ein Problem mit Zeilenumbrüchen.

    Es gibt viele Strings in welchen zB folgende Zeichenfolge vorkommt:

    [...] Teil des Strings <br/>[Zeilenumbruch]
    <br/>
    Dann geht es weiter <br/>[Zeilenumbruch]
    <br/>
    [...]

    Diese doppelten LineBreaks sollen verschwinden und durch p-Tags ersetzt werden. Ich weiß aber leider nicht genau, wie ich das anstellen soll.

    In einer Datenbank solltest du eigentlich so gut wie immer Rohdaten speichern. Also Daten, die noch keinerlei Rückschlüsse auf ihre mögliche spätere Form bei einer Ausgabe zulassen. Dazu gehört auch, dass eventuell erforderliche HTML-Elemente erst bei der Ausgabe in (X)HTML-Dokumenten hinzugefügt werden.

    Hat jemand einen Tip für mich wo ich hierzu eine Lösung finden kann oder wie man das korrekt bewerkstelligt?

    Ich handhabe dies momentan so, dass dem auszugebenden Textblock grundsätzlich ein „<p>“ an den Anfang und ein „</p>“ an das Ende gesetzt wird. Einfache Zeilenumbrüche (\n) werden zu „<br />“, doppelte zu „</p><p>“. Hier hinzu gesellen sich dann noch ein paar Regeln, die letzteres in Bezug auf die korrekte Schachtelung von (X)HTML-Elementen anwenden.

    Einen schönen Freitag noch.

    Gruß, Ashura

    --
    sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
    „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
    [HTML Design Constraints: Logical Markup]
    1. Hallo Ashura,

      In einer Datenbank solltest du eigentlich so gut wie immer Rohdaten speichern. Also Daten, die noch keinerlei Rückschlüsse auf ihre mögliche spätere Form bei einer Ausgabe zulassen. Dazu gehört auch, dass eventuell erforderliche HTML-Elemente erst bei der Ausgabe in (X)HTML-Dokumenten hinzugefügt werden.

      Schon klar, das ist ja auch ansonsten der Fall ... in diesem speziellen Feld aber nicht und ich habe auch keine Möglichkeit das zu ändern.
      Das heißt, lösen muss ich das jetzt trotzdem.

      Hat jemand einen Tip für mich wo ich hierzu eine Lösung finden kann oder wie man das korrekt bewerkstelligt?

      Ich handhabe dies momentan so, dass dem auszugebenden Textblock grundsätzlich ein „<p>“ an den Anfang und ein „</p>“ an das Ende gesetzt wird. Einfache Zeilenumbrüche (\n) werden zu „<br />“, doppelte zu „</p><p>“. Hier hinzu gesellen sich dann noch ein paar Regeln, die letzteres in Bezug auf die korrekte Schachtelung von (X)HTML-Elementen anwenden.

      Ja, genau das will ich auch machen!
      Nur muss ich eben diese zwischendrin vorkommenden doppelten <br /> erkennen können. Da die jeweils einen Zeilenumbruch dazwischenhaben können, weiß ich nicht so genau, wie ich das auf eine halbwegs sichere Art und Weise bewerkstelligen soll.

      Liebe Grüße
      sunny

      1. per
        str_replace vllt.

        guck mal ob du ihier was

        http://de2.php.net/manual/de/ref.strings.php

        1. Hallo,

          per
          str_replace vllt.

          guck mal ob du ihier was

          http://de2.php.net/manual/de/ref.strings.php

          glaube, Du hast mich falsch verstanden, bzw. ich hab mich vielleicht undeutlich ausgedrückt, ist ja auch ein bisschen "blöd" zu erklären.

          Mir geht es nicht darum, wie ich einen Ersetzvorgang durchführen kann sondern darum, wie ich auf eine halbwegs sichere Art und Weise genau diese Konstellation der <br />s mit Zeilenumbrüchen dazwischen finden kann um sie dann zu ersetzen! Also darum, wie mein Pattern lauten muss.

          Liebe Grüße
          sunny

          1. wie ich auf eine halbwegs sichere Art und Weise genau diese Konstellation der <br />s mit Zeilenumbrüchen dazwischen finden kann um sie dann zu ersetzen!

            Was ist dein größeres Problem die stellen zu finden oder zu ersetzten?

            mfg

            Phil

            1. Hallo nochmal,

              wie ich auf eine halbwegs sichere Art und Weise genau diese Konstellation der <br />s mit Zeilenumbrüchen dazwischen finden kann um sie dann zu ersetzen!

              Was ist dein größeres Problem die stellen zu finden oder zu ersetzten?

              Naja, wie schon im Ausgangspost beschrieben, ich weiß nicht wie ich zwei  <br />s welche durch einen Zeilenumbruch voneinander getrennt sind auffinden kann, und zwar so, dass das relativ zuverlässig funktioniert.

              Die Methode, die ich getestet habe (siehe Ausgangsposting) funktioniert zwar auf meinem Testserver, macht aber zB. in der Live-Umgebung Probleme. Obwohl ich das so ohnehin nicht einsetzen wollen würde, habe ich ausprobiert, ob es auf diese Art irgendwie läuft ...

              Die Daten kommen jeweils per POST an mein Script und ich weiß nicht so recht, wie ich zuverlässig diese <br />s mit Zeilenwechsel finden und ersetzen kann.

              Hoffentlich war es jetzt verständlich ... :-/

              Grüße
              sunny

  2. echo $begrüßung;

    Diese doppelten LineBreaks sollen verschwinden
    Dann hätte ich es noch mit "/<br />\n<br />/" versucht, das hat aber gar nicht geklappt.

    Das ist doch schon fast die Lösung. Als Teil zwischen den <br>s sollten vielleicht besser alle Whitespace-Zeichen (\s), die 0 bis mehrmals vorkommen dürfen (*), gefunden werden.

    Vielleicht hat der Versuch mit den \n nicht funktioniert, weil stattdessen \n\r da steht.

    Übrigens, als Anfangs- und Endzeichen eines regulären Ausdrucks dürfen auch andere Zeichen als Slashes stehen (z.B. #) (siehe http://de.php.net/manual/en/ref.pcre.php gleich am Anfang). Das hat den Vorteil, dass dann ein / nicht maskiert werden muss (/) und damit die Lesbarkeit verbessert werden kann.

    Vielleicht möchtest du auch noch zwischen <br und /> 0 bis beliegig viele Whitespace-Zeichen zulassen und den / optional (0 oder einmal) machen.

    echo "$verabschiedung $name";

    1. Hallo dedlfix,

      Diese doppelten LineBreaks sollen verschwinden
      Dann hätte ich es noch mit "/<br />\n<br />/" versucht, das hat aber gar nicht geklappt.

      Das ist doch schon fast die Lösung. Als Teil zwischen den <br>s sollten vielleicht besser alle Whitespace-Zeichen (\s), die 0 bis mehrmals vorkommen dürfen (*), gefunden werden.

      Stimmt, das hatte ich mir auch schon überlegt ...

      Vielleicht hat der Versuch mit den \n nicht funktioniert, weil stattdessen \n\r da steht.

      Aaah, das ist ein guter Tipp! Das kann natürlich der Fall sein ...
      Leider kann ich momentan nicht auf die Daten zugreifen, erst am Montag wieder, und kann das somit nun nicht testen.
      Hoffentlich ist der Thread auch am Montag noch da und nicht im Archiv verschwunden, werde das gleich in der Früh in Angriff nehmen.

      Etwas irritiert bin ich, weil ich heute beim Herumtesten gesehen habe, dass der  gePOSTete String in der Liveumgebung exakt identisch aussieht wie in der Testumgebung, sich das Ganze aber dennoch unterschiedlich verhält. Selbst mit statischen Teststrings welche ich angelegt habe und komplett gleich waren, zumindest ausgesehen haben (irgendein Unterschied muss da ja gewesen sein) hat es unterschiedliche Ergebnisse gegeben.

      Aber vielleicht ist Dein Hinweis ja schon des Rätsels Lösung und ich muss nur alle Eventualitäten von Zeilenumbrüchen suchen!

      Übrigens, als Anfangs- und Endzeichen eines regulären Ausdrucks dürfen auch andere Zeichen als Slashes stehen (z.B. #) (siehe http://de.php.net/manual/en/ref.pcre.php gleich am Anfang). Das hat den Vorteil, dass dann ein / nicht maskiert werden muss (/) und damit die Lesbarkeit verbessert werden kann.

      Danke für den Hinweis!

      Vielleicht möchtest du auch noch zwischen <br und /> 0 bis beliegig viele Whitespace-Zeichen zulassen und den / optional (0 oder einmal) machen.

      Ebenfalls ein guter Tipp, muss ich aber im Grunde nicht machen, da die <br /> immer in genau dieser Form bei mir (also besser gesagt dem Script) ankommen und es da keine Ausnahme gibt.

      Vielen Dank für Deine Hilfe!

      Liebe Grüße
      sunny

      1. Guten Morgen!

        Hallo dedlfix,

        Diese doppelten LineBreaks sollen verschwinden
        Dann hätte ich es noch mit "/<br />\n<br />/" versucht, das hat aber gar nicht geklappt.

        Das ist doch schon fast die Lösung. Als Teil zwischen den <br>s sollten vielleicht besser alle Whitespace-Zeichen (\s), die 0 bis mehrmals vorkommen dürfen (*), gefunden werden.

        Stimmt, das hatte ich mir auch schon überlegt ...

        Vielleicht hat der Versuch mit den \n nicht funktioniert, weil stattdessen \n\r da steht.

        Aaah, das ist ein guter Tipp! Das kann natürlich der Fall sein ...
        Leider kann ich momentan nicht auf die Daten zugreifen, erst am Montag wieder, und kann das somit nun nicht testen.
        Hoffentlich ist der Thread auch am Montag noch da und nicht im Archiv verschwunden, werde das gleich in der Früh in Angriff nehmen.

        Tja, wie das immer so ist, bin ich natürlich am Morgen nicht gleich dazu gekommen weil sich schon wieder ein "Haufen" anderer Arbeit angesammelt hatte!
        Aber jetzt gerade habe ich es getestet - und siehe da, es funktioniert!

        Aber vielleicht ist Dein Hinweis ja schon des Rätsels Lösung und ich muss nur alle Eventualitäten von Zeilenumbrüchen suchen!

        Mein Pattern sieht jetzt so aus:
        #<br />\s*<br />#

        Und damit funktioniert es bisher einwandfrei! Ich denke, das ist so in Ordnung?

        Vielen Dank jedenfalls für Deine hilfreichen Tipps!

        Sonnige Grüße aus Salzburg
        sunny