Stephan: nl2br Unzulänglichkeiten

Hallo zusammen,

ich hab mittlerweile an mehreren Stellen Textareas in denen User (HTML)-Text eingeben können und dessen Inhalt dann in einer Datenbank gespeichert wird und später wieder als HTML ausgegeben wird. Eigentlich eine typische Gästebuchfunktion.

Bis jetzt gebe ich dann die Ausgabe mit nl2br() formatiert aus, das funktioniert in den meissten Fällen auch wunderbar:

Eingabe-Bsp:

Das ist der
Gästebucheintrag.

wird zu

Das ist der </ br>
Gästebucheintrag.

Doch leider kommen auch immer wieder solche Einträge vor:

Das ist der <a href="http://xyz.de"
target="_blank">Link</a>

Oder:

<table>
  <tr>
    <td>Test1</td>
    <td>Test2</td>
  </tr>
</table>

Und dann sind die Ergebnisse von nl2br() katastrophal.

Jetzt hab ich schon öfter im Internet gesucht aber nix gefunden.

Das müsste doch irgendwie zu lösen sein, oder?
Da hat doch bestimmt einer von euch einen schlauen RegExp in der Tasche der die Zeilenumbrüche nur macht wenn die Zeile nicht mit nem HTML-Tag aufhört, oder? ;-)

So eine Funktion wäre bestimmt für mehr Personen hier interessant.

Gruß
Stephan

  1. Huhu Stephan

    Das müsste doch irgendwie zu lösen sein, oder?
    Da hat doch bestimmt einer von euch einen schlauen RegExp in der Tasche der die Zeilenumbrüche nur macht wenn die Zeile nicht mit nem HTML-Tag aufhört, oder? ;-)

    Du meinst wenn sich der Suchtreffer nicht innerhalb eines Tags befindet, oder?

    Das kann man mit einem negativen lookahead machen.

    http://de3.php.net/manual/en/reference.pcre.pattern.syntax.php

    Das könnte in Deinem Beispiel ungefähr so ausschauen:

    $regexp = "#(\n)(?![^<]+>)#";

    Viele Grüße

    lulu

    --
    bythewaythewebsuxgoofflineandenjoytheday
    1. Huhu lulu

      Du meinst wenn sich der Suchtreffer nicht innerhalb eines Tags befindet, oder?

      Ja innerhalb eines Tags, oder am Zeilenende ein HTML-Tag steht.

      Bsp.

      <table>
        <tr>
          <td>irgendwas</td>

      Wird ja sonst noch zu

      <table><br />
        <tr><br />
          <td>irgendwas</td>><br />

      usw.

      Kann man beides mit einem Regexp erschlagen?

      Gruß
      Stephan

      1. Hi Stephan

        mmmmh, so ganz habe ich es nicht begriffen welche Newlines denn
        nun eigentlich ersetzt werden sollen.

        Schreib doch mal ein kurzes Vorher-Nachher Beispiel.

        Viele Grüße

        lulu

        --
        bythewaythewebsuxgoofflineandenjoytheday
        1. mmmmh, so ganz habe ich es nicht begriffen welche Newlines denn
          nun eigentlich ersetzt werden sollen.

          Schreib doch mal ein kurzes Vorher-Nachher Beispiel.

          Okay:

          Bei folgendem String soll der _Text_ umgebrochen werden so dass weiterhin valider HTML besteht:

          __________________________________

          Hallo,

          das soll ein Test sein: <b>fetter Text</b>

          hier zur verdeutlichung der Inhalte die Texte in einer Tabelle:

          <table>
           <tr>
            <td>Punkt 1</td>
            <td>Infos zu Punkt 1</td>
           </tr>
           <tr>
            <td>Punkt 2</td>
            <td>Information die
                über 2 Zeilen gehen und somit auch einen
                Zeilen Umbruch brauchen</td>
           </tr>
          </table>

          Und noch ein <a href="tag.html"
          target="_blank">Tag</a> der über
          2 Zeilen geht.

          __________________________________

          soll werden zu:
          __________________________________

          Hallo,<br />
          <br />
          das soll ein Test sein: <b>fetter Text</b><br />
          <br />
          hier zur verdeutlichung der Inhalte die Texte in einer Tabelle:<br />
          <br />
          <table>
           <tr>
            <td>Punkt 1</td>
            <td>Infos zu Punkt 1</td>
           </tr>
           <tr>
            <td>Punkt 2</td>
            <td>Information die<br />
                über 2 Zeilen gehen und somit auch einen<br />
                Zeilen Umbruch brauchen</td>
           </tr>
          </table>
          <br />
          Und noch ein <a href="tag.html"
          target="_blank">Tag</a> der über<br />
          2 Zeilen geht.<br />

          __________________________________

          Ist sowas überhaupt lösbar???

          1. Hallo Stephan,

            Bei folgendem String soll der _Text_ umgebrochen werden so dass weiterhin valider HTML besteht:

            __________________________________
            [Beispielcode]
            __________________________________

            Ist sowas überhaupt lösbar???

            Meiner Meinung nach nicht ohne größeren Aufwand.
            Es ließe sich vielleicht lösen, wenn du das Dokument mit den DOM-Erweiterungen von PHP auseinandernimmst und dann die Zeilenumbrüche umwandelst. Aber das ist so ein großer Aufwand (du musst sehr viele Dinge beachten), sodass du vielleicht mit BBCode besser bedient bist.

            Viele Grüße
              Patrick Canterino

            --
            "Die große Frage, die ich trotz meines dreißigjährigen Studiums der weiblichen Seele nicht zu beantworten vermag, lautet: 'Was will eine Frau eigentlich?'" (Sigmund Freud)
          2. Hi,

            Bei folgendem String soll der _Text_ umgebrochen werden so dass weiterhin valider HTML besteht:

            Warum willst Du in einer td mit einem hartkodierten Zeilenumbruch arbeiten?
            Der Text bricht doch sowieso um, wenn der Inhalt breiter würde als es die Tabellenzelle zuläßt.
            (Wobei ich mich sowieso frage, ob es sich hier überhaupt um tabellarische Daten handelt ...)

            cu,
            Andreas

            --
            Warum nennt sich Andreas hier MudGuard?
            Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.