Joerg: HTML Code bereinigen mittels regulärem Ausdruck

Hi,

zurzeit kämpfe ich mit dem Problem, HTML Code zu bereinigen. Speziell von Word 2000 erzeugten überflüssigen Attributen.

Beispiel:
<TD style="PADDING-RIGHT: 5.4pt; BACKGROUND-POSITION: 0% 0%; PADDING-LEFT: 5.4pt; BACKGROUND-ATTACHMENT: scroll; BACKGROUND-IMAGE: none; PADDING-BOTTOM: 0cm; WIDTH: 85.2pt; PADDING-TOP: 0cm; BACKGROUND-REPEAT: repeat; mso-shading: white; mso-pattern: solid navy" vAlign=top width=114>

Es dürfen hierbei nur die 'mso-' Attribute entfenrt werden.

Für einen regulären Ausdruck, der das schafft, wäre ich sehr dankbar.

Gruß
Jörg

  1. Hi Jörg!

    In Perl würde ich das so machen:

    Datei einlesen und dann

    $zeile =~ s/mso-(?:.*?);//ig;

    ?: verhindert, dass das Ergebnis der Klammer in $1 gespeichert wird.
    Das zweite ? bewirkt "stingy matching". Also nur bis zum ersten folgenden ; wird ersetzt.

    Stefan

    1. Hallo Stefan,

      $zeile =~ s/mso-(?:.*?);//ig;

      ich würde es mit
        $zeile =~ s/mso-[^;]*//ig;
      versuchen - wobei bei html-Code von Word ein
        $zeile =~ s/<td[^>]*>/<td>/ig;
      effektiver ist :-)

      @Joerg:
      um das ganze in Javascript umzusetzen (warum eigentlich nicht serverseitig?) dürfte dir http://de.selfhtml.org/javascript/objekte/string.htm#replace helfen.

      Grüße aus Nürnberg
      Tobias

      --
      Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
  2. Hi Jörg!

    Noch was vergessen: Vielleicht hilft Dir auch http://www.w3.org/People/Raggett/tidy/

    Stefan

    1. Hi,

      mittlerweile sind einige Tipps eingegangen, die mir aber nicht wirklich weiterhelfen.

      Ich brauche eine Lösung, die clientseitig im Browser läuft und beim reinkopieren eines Textes aus Word in einen DHTML-Editor das HTML bereinigt. Eine Teillösung habe ich gefunden, aber leider bleiben die mso-Attribute im STYLE-Attribut übrig. Den Text vor der Quellcodeansicht jedesmal zum Server zu schicken und z. B. Tidy drüberlaufen zu lassen, wäre reichlich umständlich.

      Hier ein Teilauszug des Script-Codes, der schon sehr viel filtert, aber leider noch zu wenig:

      if (/(<[^>]*)class=Mso[^>]+(>)/gi.test(sBuffer))
      {
        fHTMLCodeCleaned=true;
        sBuffer=sBuffer.replace(/(<[^>]*)class=Mso[^>]+(>)/gi, "$1$2");
      }

      Wie ihr seht, komme ich mit euren Tipps nicht weit, es muss eine scriptbasierte Lösung sein.

      Gruß
      Jörg

  3. Moin,

    die Lösung von Stefan ist natürlich funktional aber wäre hier nicht ein XSLT besser angebracht? (evtl. isses natürlich einfach "Kahlschlag".)

    Gruß,
    KonRad -

    --
    »Choose life.« - Trainspotting, drug addict
    »Choose life.« - Deuteronomy 30.19, GOD
    1. Hallo Konrad,

      die Lösung von Stefan ist natürlich funktional aber wäre hier nicht ein XSLT besser angebracht?

      was willst du an dieser Stelle mit XSLT machen?

      Grüße aus Nürnberg
      Tobias

      --
      Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
      1. Hallo Konrad,

        die Lösung von Stefan ist natürlich funktional aber wäre hier nicht ein XSLT besser angebracht?
        was willst du an dieser Stelle mit XSLT machen?

        Das Dokument transformieren und bei der Transformation nur gültige XHML-Tags und -Attribute übernehmen und alles andere fallen lassen.

        Zugegeben, das XSLT wäre dann natürlich enorm.

        Gruß,
        KonRad -

        --
        »Choose life.« - Trainspotting, drug addict
        »Choose life.« - Deuteronomy 30.19, GOD
        1. Hallo Konrad,

          die Lösung von Stefan ist natürlich funktional aber wäre hier nicht ein XSLT besser angebracht?
          was willst du an dieser Stelle mit XSLT machen?
          Das Dokument transformieren und bei der Transformation nur gültige XHML-Tags und -Attribute übernehmen und alles andere fallen lassen.

          theoretisch ist die Idee garnicht so schlecht - nur müsste das was zu bereinigende Dokument dann wohlgeformt sein ...

          Grüße aus Nürnberg
          Tobias

          --
          Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
  4. Hi Joerg,

    zurzeit kämpfe ich mit dem Problem, HTML Code zu bereinigen. Speziell von Word 2000 erzeugten überflüssigen Attributen.

    Vielleicht interessiert Dich der Ansatz über den RegEx ja theoretisch, denn es gibt ja wirklich gute Programme, die den Word-Mist killen können.

    Viele Grüße
    Mathias Bigge

    1. Hi Mathias,

      mit regulären Ausdrücken kenne ich mich recht gut aus und habe auch schon diverse Word-Killer-Ausdrücke im Netz gefunden. Aber diese machten entweder zu viel kaputt oder es blieben Reste übrig. Scheint eine komplizierte Sache zu sein.

      Gruß
      Jörg

      1. Hi Jörg,

        mit regulären Ausdrücken kenne ich mich recht gut aus und habe auch schon diverse Word-Killer-Ausdrücke im Netz gefunden. Aber diese machten entweder zu viel kaputt oder es blieben Reste übrig. Scheint eine komplizierte Sache zu sein.

        Wenn Du Dir den irren Code ansiehst, den Word produziert, kannst Du Dir leicht vorstellen, dass nicht ganz leicht zu sagen ist, was man herausnehmen kann, ohne die Funktion zu zerstören.
        Wirklich gut kann das der hier so unbeliebte Dreamweaver. Ich zitiere mal, was er alles so entfernt (die Auswahl ist konfigurierbar):

        HTML
        "Word-spezifischen HTML-Code, einschließlich XML von html-Tags, eigene Word-Metadaten und Link-Tags im Head-Bereich des Dokuments, Word-XML-Marken, bedingte Tags und ihren Inhalt sowie leere Absätze und Randdefinitionen aus Formatvorlagen."

        CSS
        "alle Word-spezifischen CSS-Elemente, einschließlich Inline-CSS-Stile, wenn zulässig (dabei hat der übergeordnete Stil die gleichen Stileigenschaften), Stilattribute, die mit mso beginnen, alle Stildeklarationen, die nicht CSS entsprechen, alle CSS-Stile aus Tabellen sowie alle nicht benutzten Stildefinitionen aus dem Head-Bereich"

        Weitere typische Word-Fehler:

        • endlose font-tags und font-tags außerhalb von Absätzen und Überschirften
        • falsche Codierung der Hintergrundfarben

        Es sind doch einige Dinge dabei, die Du mit einem RegEx nicht erwischen kannst.

        Viele Grüße
        Mathias Bigge

        1. Hi Mathias,

          Dreamweaver ist genau das Programm, was ich zum testen herangezogen hatte, um den Wordkram zu entfernen. Aber das läuft ja nu leider nicht im Browser, sondern extern.

          Ich hab ja die Hoffnung noch nicht aufgegeben, DEN 500 Zeichen langen regulären Ausdruck dafür zu finden ;-)

          Gruß
          Jörg