Encoder: Umgang mit HTML in Gästebucheinträgen

Hallo
Ich hab grad eine interessante Fragestellung.
In einem Gästebuch kann man bei einem neuen Eintrag einfach nur Text eingeben, der dann vom Script in <p> </p> gesetzt wird.
Man kann aber auch Tags angeben. Zum Beispiel Bilder oder Überschriften definieren.
Die werden dann ebenfalls fest in <p> </p> gesetzt, weil das Script das ohne nachzudenken immer so macht. Sieht natürlich dann ziemlich doof aus, als Code nämlich so.

<p>
<h1>Das ist eine Überschrift vom Benutzer</h1>
hier kommt Text vom Benutzer
<img src="das Bild kann auch der Benutzer eingeben" />
</p>

Der Browser kapiert das nicht und wendet auf den Text nicht mehr die gewünschte Formatierung an.

Ich suche jetzt eine Möglichkeit, mit sowas zurecht zu kommen.
Schön wärs wenn das Script den reinen Text erkennen könnte und ihn automatisch mit regelkonformen <p> </p> umschließt.

Ich befürchte allerdings dass das in einer ziemlichen Schlacht von regular expressions ausartet. Mit denen bin ich nicht so fit dass ich das hinkriege.
Kann mir da jemand einen Tip geben?

Zur Verdeutlichung. Wenn ich sowas hier eingebe

<h1>Überschrift</h1>Hallo das hier ist normaler Text <img src="...." /> <h2>Überschrift 2</h2>und hier wieder weiter...

dann soll das hier dabei rauskommen.
<h1>Überschrift</h1><p>Hallo das hier ist normaler Text <img src="...." /></p><h2>Überschrift 2</h2><p>und hier wieder weiter...</p>

  1. Tach!

    <p>
    <h1>Das ist eine Überschrift vom Benutzer</h1>
    hier kommt Text vom Benutzer
    <img src="das Bild kann auch der Benutzer eingeben" />
    </p>

    Der Browser kapiert das nicht und wendet auf den Text nicht mehr die gewünschte Formatierung an.

    Das ist ja auch syntaktisch falsch. Da p nur Inline-Elemente enthalten darf schließt das Block-Element h1 das p-Element implizit. Was danach kommt, steht dann jedenfalls nicht mehr in einem p.

    Ich suche jetzt eine Möglichkeit, mit sowas zurecht zu kommen.

    BBCode mit begrenztem Sprachumfang. Wenn du HTML verwenden möchtest, musst du eine ziemlich große Menge Missbrauchsmöglichkeiten kennen, erkennen und ausschließen. Lass das mit dem HTML lieber bleiben.

    Ich befürchte allerdings dass das in einer ziemlichen Schlacht von regular expressions ausartet.

    Die Regular Expressions sind nur ein kleiner Teil des HTML-Parsers, den du dir da schreiben müsstest.

    dedlfix.

    1. Ja dass es wahrscheinlich nicht so viel kann wie gewünscht, das ist mir fast schon klar.

      BBCode mit begrenztem Sprachumfang. Wenn du HTML verwenden möchtest, musst du eine ziemlich große Menge Missbrauchsmöglichkeiten kennen, erkennen und ausschließen.

      Das mit dem Missbrauch ist mir bekannt. Der kommt später dran, sofern diese Idee überhaupt weiter verfolgt wird.
      Mit BBCode hätte ich ja praktisch das selbe Problem, sobald dieser in HTML Tags übersetzt wird. Die Schwierigkeit ist herauszufinden, was nicht-getaggter Text ist und was nicht.

      Es muss nicht alles komplett abdecken. Für den Anfang würde es schon reichen wenn Überschriften erkannt würden, es geht um was internes mit sehr begrenzten Anforderungen.
      <img> darf ja innerhalb eines <p> vorkommen, das kann bleiben wie es ist.
      Sonstige Spielereien wie Listen usw. sind erst mal nicht relevant.

      Ich stelle mir den Ablauf so vor:

      • Suche < auf das (mit Leerzeichen) h1 folgt. (Oder h2)
      • die Position definiert den Plaintextblock bis vor die Klammer <
      • dieser wird, sofern nicht leer, mit <p> </p> umschlossen
      • dann wird alles ab dem < ausgegeben, bis zum Ende dieses Tags.
      • dann gehts wieder oben weiter, solange bis nichts mehr da ist.
        Ich würds nur gerne nicht zu primitiv mit Suche nach "<" und so weiter machen, sondern das was geht mit regex abbilden. Da fehlt mir leider die Praxis und Ahnung, was überhaupt alles geht.
      1. Tach!

        BBCode mit begrenztem Sprachumfang. Wenn du HTML verwenden möchtest, musst du eine ziemlich große Menge Missbrauchsmöglichkeiten kennen, erkennen und ausschließen.
        Mit BBCode hätte ich ja praktisch das selbe Problem, sobald dieser in HTML Tags übersetzt wird. Die Schwierigkeit ist herauszufinden, was nicht-getaggter Text ist und was nicht.

        Jein. Mit BBCode werden üblicherweise nur sehr wenig Elemente ohne oder mit nur einem Attribut zugelassen. Man kann sich dann immer noch beim Verschachteln verschreiben, aber das bügelt der BBCode-Parser aus. Den brauchst du nicht neu zu erfinden, den gibt schon fertig.

        Schau dir mal Textile an. Die Syntax ist einfacher als HTML oder BBCode und auch dafür ist der Parser bereits fertig vorhanden. Problem gelöst - würde ich sagen.

        dedlfix.

  2. Om nah hoo pez nyeetz, Encoder!

    Die werden dann ebenfalls fest in <p> </p> gesetzt, weil das Script das ohne nachzudenken immer so macht. Sieht natürlich dann ziemlich doof aus, als Code nämlich so.

    Dir wäre eventuell schon damit geholfen:

    Ersetze "<h1>" durch "<p class='h1'>" und "</h1>" durch "</p><p>"

    * Manchmal sind schließende p-Tags optional.
    * Du hast dann ggf. unschöne leere Absätze.

    Matthias

    --
    1/z ist kein Blatt Papier.

    1. Dir wäre eventuell schon damit geholfen:

      Ersetze "<h1>" durch "<p class='h1'>" und "</h1>" durch "</p><p>"

      Dann könnt ich doch gleich <h1> durch </p><h1> ersetzen und </h1> durch </h1><p>
      Falls nach <h1> noch irgendwas zu ersetzendes vorkommt, ergibt das leere <p></p>
      Die lösche ich danach aus dem String raus und hab doch eigentlich genau das was ich will.

      Danke fürs Simplifizieren meiner Gedanken :-)