Peegee: <br> statt <p>: umbruch in absatz umwandeln

Hallo,

nach langer Suche im Web muss ich mich jetzt doch an euch wenden.

Und zwar hab ich einen HTML-Text vorliegen in welchem es nur <br>,<p>,<i>,<b>,<hr> tags gibt. Nun möchte ich aber alle Absätze (<p>) in Umbrüche (<br>) wandeln.

Ich habe das selber mit allen möglichen Varianten versucht, aber das ist gar nicht so einfach, da z.B. ein Absatz mit <p><b></b><i></i></p> optisch gar nicht angezeigt wird.

Hat da wer eine Idee oder Funktion wie man das lösen kann?

lg

  1. Liebe(r) Peegee,

    Du willst also Deinen Text jeglicher Reststruktur berauben? Warum?

    Es ist sinnvoll, einen Text in Sinnabschnitte (Absätze) zu gliedern. Dazu gibt es schließlich die <p>-Elemente. Wenn Du diese entfernst, dann verlier Dein Text an Struktur, was sehr zu bedauern wäre.

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Hallo Felix,

      ich versuchs mal zu erklären:

      der text wurde im prinzip über einen stark abgespeckten wysiwyg-editor (nur mit fett, kursiv und hr-trennlinie) eingegeben und im style-sheet war das p-element auf margin und padding: 0px eingestellt. daher sieht der umbruch in html genau so aus wie der absatz.

      ich habe jetzt eine funktion die diesen einfachen html-text graphisch darstellen soll. diese funktion gibt es schon, aber es gibt halt für den umbruch nur eine funktion, daher brauche ich die genaue umwandlung der absätze in einen umbruch.

      1. Hallo Felix,

        ich versuchs mal zu erklären:

        der text wurde im prinzip über einen stark abgespeckten wysiwyg-editor (nur mit fett, kursiv und hr-trennlinie) eingegeben und im style-sheet war das p-element auf margin und padding: 0px eingestellt. daher sieht der umbruch in html genau so aus wie der absatz.

        Mit anderen worten

        <p>foo</p>
        <p>bar</p>

        soll werden zu

        <p>foo<br />bar</p>

        <p>foo</p>
        <p></p>
        <p>bar</p>

        soll werden zu

        <p>foo</p>
        <p>bar</p>

        Du musst also nur </p><p> durch <br /> ersetzen und </p><p></p><p> durch </p><p>

        Oder sehe ich das jetzt falsch?

        1. Om nah hoo pez nyeetz, suit!

          Oder sehe ich das jetzt falsch?

          Ich sehe das auch so und frage mich, was das mit PHP zu tun hat, wo es doch eine Frage "suchen/ersetzen" in einem Text-Editor ist.

          Notepad++ z.B. kann das für beliebig viele (durch den Arbeitsspeicher begrenzt) Dateien in einem Rutsch.

          Matthias

          --
          Wer ein Problem beschreiben kann, hat es schon halb gelöst.                                             (Julian Huxley) http://www.billiger-im-urlaub.de/kreis_sw.gif
        2. Hallo,

          Mit anderen worten

          <p>foo</p>
          <p>bar</p>

          soll werden zu

          <p>foo<br />bar</p>

          nein, ich verstehe es eher so, dass

          <p>foo</p>
          <p>bar</p>

          zu

          foo<br>
          bar<br>

          werden soll, weil die weiterverarbeitende Software nur Zeilenumbrüche verarbeitet.

          Ciao,
           Martin

          --
          Der Professor sitzt beim Essen in der Mensa. Ein Student setzt sich ihm unaufgefordert gegenüber.
          Professor: Seit wann essen denn Schwein und Adler an demselben Tisch?
          Student:   Na gut, dann flieg' ich eben zum nächsten Tisch.
          Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
          1. Hallo,

            nein, ich verstehe es eher so, dass

            <p>foo</p>
            <p>bar</p>

            zu

            foo<br>
            bar<br>

            werden soll, weil die weiterverarbeitende Software nur Zeilenumbrüche verarbeitet.

            Ciao,
            Martin

            genau so ist es.
            das problem ist halt, dass man nicht einfach das </p>-tag gegen ein <br> tauschen kann, weil die absätze ein paar eigenheiten haben.

            Beispiel:
            <p>&nbsp;</p>  -> benötigt eine Zeile Platz
            <p> </p> -> benötigt KEINEN Platz
            <p></p> -> benötigt auch KEINEN Platz

            einfach mal selber probieren:

              
            $text="a<p></p>b";  
              
            echo $text;  
            
            

            und zwischen dem <p></p> setzt ihr einmal ein maskiertes leerzeichen (&nbsp;), einmal ein normales leerzeichen und einmal nichts ein.

            1. Om nah hoo pez nyeetz, Peegee!

              und zwischen dem <p></p> setzt ihr einmal ein maskiertes leerzeichen (&nbsp;), einmal ein normales leerzeichen und einmal nichts ein.

              Warum willst du das mit php lösen?

              Matthias

              --
              Wer ein Problem beschreiben kann, hat es schon halb gelöst.                                             (Julian Huxley) http://www.billiger-im-urlaub.de/kreis_sw.gif
              1. Warum willst du das mit php lösen?

                weil ein php-skript die grafische ausgabe macht. und ich muss eben dem text vorher so umwandeln, dass nur noch <br>-tags drinnen sind, und eben keine <p>-tags..

                1. Liebe(r) Peegee,

                  weil ein php-skript die grafische ausgabe macht.

                  tut mit leid, aber hier muss ich mich ausklinken - um meine Nerven zu schonen.

                  Liebe Grüße,

                  Felix Riesterer.

                  --
                  ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
                  1. tut mit leid, aber hier muss ich mich ausklinken - um meine Nerven zu schonen.

                    schade, ich kann auch nix dafür.

                    ob da jetzt etwas graphisch mit php ausgegeben wird oder nicht, hat aber eigentlich nichts mit der aufgabenstellung (=> einen absatz wie einen umbruch behandeln) zu tun.

                    1. Liebe(r) Peegee,

                      ob da jetzt etwas graphisch mit php ausgegeben wird

                      mit PHP wird nix grafisch ausgegeben, oder erzeugst Du hier Bilddateien mit PHP? Nein? Also dann doch Text? Aha, und was hat "Text ausgeben" mit "grafisch" zu tun?

                      Dein PHP-Script liefert ein Dokument aus. Dieses wird erst vom Browser, lange nachdem PHP mit seiner Arbeit fertig ist, sichtbar gemacht. Für die Darstellung im Browser, die man dann durchaus als grafisch bezeichnen kann, ist PHP in keiner Weise zuständig, sondern allenfalls die im Browser mit CSS visuell ausgestaltete Struktur des von PHP ausgegebenen Dokuments. Und dieses ist in (X)HTML notiert. Ja, und nun bist Du gerade dabei, aus visuellen Erwägungen in Deinem serverseitigen Vorgang in der Dokumentstruktur herumzupfuschen, anstatt Dich mit CSS und einer vernünftigen Dokumentstruktur auf _Clientseite_(!!!) zu beschäftigen.

                      Schade. Unsinn wie er leider nur allzuoft immer wieder passiert.

                      Liebe Grüße,

                      Felix Riesterer.

                      --
                      ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
                      1. Hallo Felix,

                        da hab ich mich dann wohl falsch ausgedrück.
                        Es geht tatsächlich um eine Darstellung eines HTML-Textes als Bild.
                        Und die Darstellung im Bild soll genau so aussehen wie die Darstellung in der Webseite (wenn man davon ausgeht, dass ein Absatz genau so aussieht wie ein Umbruch -> weil eben im CSS der p-Tag auf margin:0px und padding:0px gestellt wurde)

                        1. Liebe(r) Peegee,

                          da hab ich mich dann wohl falsch ausgedrück.

                          nein, Du hast eine völlig andere Problemstellung gepostet. Du wolltest eine String-Ersetzung vornehmen. Meine Reaktion darauf war eine Rückfrage, warum Du das wolltest. Deine Klarstellung lautete:

                          ich habe jetzt eine funktion die diesen einfachen html-text graphisch darstellen soll.

                          Was hätte ich mir darunter wohl vorstellen sollen? Warum nennst Du die Dinge nicht beim Namen?

                          Es geht tatsächlich um eine Darstellung eines HTML-Textes als Bild.

                          Es geht um eine mit PHP erzeugte Bilddatei. In das Bild soll nun mittels PHP Textinhalt geschrieben werden.

                          Und die Darstellung im Bild soll genau so aussehen wie die Darstellung in der Webseite

                          Du willst eine Seitenvorschau in einer Bilddatei erstellen (so heißt das in gewöhnlichem Deutsch). Dabei ist Dir hoffentlich klar, dass Du in den verschiedenen Browsern so viele unterschiedliche Darstellungen haben kannst, dass Deine Bilddatei zum Teil erheblich vom im aktuell verwendeten Browser Sichtbaren abweichen kann.

                          Genügen die Dir zur ursprünglich gestellten Stringersetzungsaufgabe gegebenen Hinweise, oder stehst Du da noch vor ungelösten Problemen?

                          Liebe Grüße,

                          Felix Riesterer.

                          --
                          ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
                          1. Genügen die Dir zur ursprünglich gestellten Stringersetzungsaufgabe gegebenen Hinweise, oder stehst Du da noch vor ungelösten Problemen?

                            Problem ist noch vorhanden. Die Unterschiede der Browser sind gar nicht so eklatant wie ich das selber befürchtet habe.

                            das problem ist halt, dass man nicht einfach das </p>-tag oder das <p>-tag gegen ein <br> tauschen kann, weil die absätze ein paar eigenheiten haben.

                            Beispiel:
                            <p>&nbsp;</p> -> benötigt eine Zeile Platz
                            <p> </p> -> benötigt KEINEN Platz
                            <p></p> -> benötigt auch KEINEN Platz

                            einfach mal selber probieren:

                            $text="a<p></p>b";  
                              
                            echo $text;  
                            

                            und zwischen dem <p></p> setzt deu einmal ein maskiertes leerzeichen (&nbsp;), einmal ein normales leerzeichen und einmal nichts ein.

                            (Vorraussetzung ist eben, dass im CSS margin:0px und padding:0px gestellt sind, damit man sagen kann, dass ein Umbruch gleich "aussieht" wie ein Absatz)

                            1. Liebe(r) Peegee,

                              das problem ist halt, dass man nicht einfach das </p>-tag oder das <p>-tag gegen ein <br> tauschen kann, weil die absätze ein paar eigenheiten haben.

                              dann muss man eben mehrstufig ersetzen. Wo ist das Problem?

                              Beispiel:
                              <p>&nbsp;</p> -> benötigt eine Zeile Platz

                              Also ist am Ende dieses Absatzes ein <br> notwendig.
                              $text = preg_replace('~(?is)<p[^>^]*>([^ ].*?)</p>~', '$1<br />', $text); // ungetestet!

                              <p> </p> -> benötigt KEINEN Platz
                              <p></p> -> benötigt auch KEINEN Platz

                              Also können solche Zeichenketten ersatzlos entfernt werden.
                              $text = preg_replace('~(?is)<p> ?</p>~', '', $text); // ungetestet!

                              einfach mal selber probieren:

                              $text="a<p></p>b";

                              echo $text;

                                
                              Nein. Solcher Code tut mir weh. Text ohne passende Auszeichnung ("a" und "b" sind "nichts") kommt bei mir nicht vor.  
                                
                              Liebe Grüße,  
                                
                              Felix Riesterer.
                              
                              -- 
                              ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
                              
                              1. Hallo,

                                einfach mal selber probieren:

                                $text="a<p></p>b";

                                echo $text;

                                
                                > Nein. Solcher Code tut mir weh. Text ohne passende Auszeichnung ("a" und "b" sind "nichts") kommt bei mir nicht vor.  
                                  
                                und leere Absätze kommen schon erst recht nicht vor. Insofern ein praxisfremdes Beispiel.  
                                Wobei Absätze, deren Inhalt nur aus Whitespace (einschließlich &nbsp) besteht, auch nicht wirklich sinnvoll sind.  
                                  
                                Ciao,  
                                 Martin  
                                
                                -- 
                                [Es existiert kein Weg](http://community.de.selfhtml.org/zitatesammlung/zitat40), "für" etwas zu optimieren, sondern nur gegen alles andere.  
                                  (Cheatah)  
                                Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                                
                                1. Lieber Der Martin,

                                  und leere Absätze kommen schon erst recht nicht vor. Insofern ein praxisfremdes Beispiel.

                                  *seufz* wenn das bei WYSIWYG-bearbeiteten Dokumenten immer so wäre.

                                  Wobei Absätze, deren Inhalt nur aus Whitespace (einschließlich &nbsp) besteht, auch nicht wirklich sinnvoll sind.

                                  Vielleicht sind sie nicht sinnvoll, aber wenigstens einigermaßen semantisch. ;-)

                                  Liebe Grüße,

                                  Felix Riesterer.

                                  --
                                  ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
                              2. $text = preg_replace('~(?is)<p[^>^]*>([^ ].*?)</p>~', '$1<br />', $text); // ungetestet!
                                $text = preg_replace('~(?is)<p> ?</p>~', '', $text); // ungetestet!

                                super danke, das ist schon mal ganz gut :)
                                wie weiter oben beschrieben, gibt es auch das <hr> element in meinem text.
                                wenn diese element über den RTE eingefügt wird, wird es natürlich auch immer vom p-Tag für den absatz begleitet.
                                wie stell ich das jetzt an, dass dadurch nicht zusätzliche (=unnötige) umbrüche für meine grafik-funktion entstehen?

                                1. Liebe(r) Peegee,

                                  wie stell ich das jetzt an, dass dadurch nicht zusätzliche (=unnötige) umbrüche für meine grafik-funktion entstehen?

                                  Du darfst gerne weitere Stringoperationen vor und nach den beiden Zeilen hinzufügen um Stück für Stück Dein Markup zu bereinigen. Einen habe ich noch für leere Elemente:
                                  $text = preg_replace('~(?is)<(\w)+[^>]*></\\1>~', '', $text); // ungetestet!

                                  Liebe Grüße,

                                  Felix Riesterer.

                                  --
                                  ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
                                  1. ok, danke.

                                    ich glaub mit einigen verfeinerungen kann ich es zumindest bis ganz knapp ans optimalergebnis schaffen!!

                2. Om nah hoo pez nyeetz, Peegee!

                  wenn dir der Text zur Verfügung steht, kannst du dies doch mit einem Texteditor lösen.

                  Matthias

                  --
                  Wer ein Problem beschreiben kann, hat es schon halb gelöst.                                             (Julian Huxley) http://www.billiger-im-urlaub.de/kreis_sw.gif