JürgenB: HTML mit REGEXP bereinigen

Hallo,

ich habe mehrere große Tabellen in MS-Office. Der HTML-Export sieht so aus:

<td width=161 valign=top style='width:120.5pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  padding:0cm 5.4pt 0cm 5.4pt'>

Das td erstreckt sich über bis zu drei Zeilen. Jetzt möchte ich das in ein einfaches <td> umwandeln. Da notepad++ auch Reguläre Ausdrücke unterstützt, habe ich es mit

<td .*|\s>

versucht. Dieser Ausdruck findet aber nur die erste Zeile. Kann mir jemand verraten, wie ich alles zwischen <td und > finde, um es dann durch nichts zu ersetzen?

Oder kennt ihr einen "Cleaner", der bei einem HTML alle Attribute entfernt?

Gruß
Jürgen

akzeptierte Antworten

  1. @@JürgenB

    Das td erstreckt sich über bis zu drei Zeilen. Jetzt möchte ich das in ein einfaches <td> umwandeln. Da notepad++ auch Reguläre Ausdrücke unterstützt, habe ich es mit

    <td .*|\s>
    

    versucht. Dieser Ausdruck findet aber nur die erste Zeile.

    Hm, das tut mein Texteditor (TextMate) auch. Wobei ich nicht verstehe, warum. Er ist gierig genug, nicht nur das erste Attribut zu matchen, aber nicht gierig genug, über den Zeilenumbruch zu gehen?

    Wie auch immer, <td[^>]+> tut’s bei mir.

    🖖 Живіть довго і процвітайте

    --
    „Im Vergleich mit Elon Musk bei Twitter ist ein Elefant im Porzellanladen eine Ballerina.“
    — @Grantscheam auf Twitter
    1. @@Gunnar Bittersmann

      <td .*|\s>
      

      versucht. Dieser Ausdruck findet aber nur die erste Zeile.

      Hm, das tut mein Texteditor (TextMate) auch. Wobei ich nicht verstehe, warum.

      Mir schwant da was. Und Wikipedia bestätigt den Verdacht:

      „Ein Punkt (.) bedeutet, dass an seinem Platz ein (fast) beliebiges Zeichen stehen kann.“

      Aber eben nur fast.

      „Die meisten RegExp-Implementierungen sehen standardmäßig Zeilenumbrüche nicht als beliebiges Zeichen an …“

      Aha.

      „… jedoch kann dieses in einigen Programmen mittels des sogenannten Single-Line-Modifiers s (zum Beispiel in /foo.bar/s) erreicht werden.“

      Aber in den Einstellungen des Texteditors wird man das nicht setzen können, oder?

      🖖 Живіть довго і процвітайте

      --
      „Im Vergleich mit Elon Musk bei Twitter ist ein Elefant im Porzellanladen eine Ballerina.“
      — @Grantscheam auf Twitter
      1. Hallo Gunnar,

        Mir schwant da was.

        das haben wir im Studium früher auch gern gesagt. Vor allem, wenn's um Elektrotechnik ging.
        Der Prof, der die Vorlesung "Theoretische Elektrotechnik" hielt, hieß nämlich Schwant. Eine Koryphäe in seinem Fach, aber ziemlich arrogant. Ich konnte ihn irgendwie nicht leiden.

        Einen schönen Tag noch
         Martin

        --
        Dass Dr. Oetker in Amerika eine Puddingmine entdeckt und damit seine ersten Millionen gemacht hat, ist nur ein Gerücht.
      2. Hallo Gunnar,

        „… jedoch kann dieses in einigen Programmen mittels des sogenannten Single-Line-Modifiers s (zum Beispiel in /foo.bar/s) erreicht werden.“

        Aber in den Einstellungen des Texteditors wird man das nicht setzen können, oder?

        nein. In das Suchfeld kann ich nur den Ausdruck zwischen den // eingeben.

        Gruß
        Jürgen

      3. Hi,

        „Die meisten RegExp-Implementierungen sehen standardmäßig Zeilenumbrüche nicht als beliebiges Zeichen an …“

        Aha.

        „… jedoch kann dieses in einigen Programmen mittels des sogenannten Single-Line-Modifiers s (zum Beispiel in /foo.bar/s) erreicht werden.“

        manchmal heißt der Modifier bzw. die Checkbox inder GUI auch "Dot matches all".

        Aber in den Einstellungen des Texteditors wird man das nicht setzen können, oder?

        (?s) könnte helfen.

        cu,
        Andreas a/k/a MudGuard

    2. Hallo Gunnar,

      danke, der Ausdruck bereinigt das HTML auch zeilenübergreifend (im noteoad++).

      Gruß
      Jürgen

      1. Hallo JürgenB,

        wie wär's hiermit:

        Notepad 8.3.2 bei mir.

        Rolf

        --
        sumpsi - posui - obstruxi
        1. Hallo Rolf,

          wie wär's hiermit:

          der ist zu gierig, <td.*> nimmt alles nach <td . Die Variante von Gunnar reicht bei mir, also Suchen bis zum ersten >

          Gruß
          Jürgen

          1. Hi,

            der ist zu gierig, <td.*> nimmt alles nach <td

            dann sei halt nicht so gierig: <td.*?>

            cu,
            Andreas a/k/a MudGuard

            1. Hallo MudGuard,

              na eben. Dabei sieht Jürgen gar nicht so gierig aus?!

              In PHP gibt's noch das Flag U=Ungreedy (nicht verwechseln mit u=unicode), das die Repeat-Operatoren per Default ungreedy macht. Mit dem Fragezeichen-Modifizierer macht man sie wieder greedy. Aber JS kennt das nicht. Noch nicht, vermutlich…

              Aber Java kennt das U. Mit einer anderen Bedeutung!

              Rolf

              --
              sumpsi - posui - obstruxi
              1. Hi,

                In PHP gibt's noch das Flag U=Ungreedy (nicht verwechseln mit u=unicode), das die Repeat-Operatoren per Default ungreedy macht. Mit dem Fragezeichen-Modifizierer macht man sie wieder greedy.

                Davon würde ich aber abraten. Das macht die Sache unübersichtlich, wenn die Bedeutung umgekehrt wird.

                cu,
                Andreas a/k/a MudGuard

  2. Hallo Jürgen,

    welche Sprache wird denn bei Notepadd++ für regexp genutzt? Mit JavaScript kannst du einfach diesen Ausdruck verwenden:

    /<td [^"\v]*?>/
    

    Zum Nachlesen: https://www.regular-expressions.info/dot.html

    Gruss Michael

    1. @@Michael_K

      Mit JavaScript kannst du einfach diesen Ausdruck verwenden:

      /<td [^"\v]*?>/
      

      Kannst du nicht. Der Ausdruck matcht nicht auf <td foo="bar">. Was soll das " in dem Ausdruck überhaupt?

      Außerdem matcht er weder auf

      <td
      foo='bar'>
      

      noch auf <td foo='bar'> (mit Tab); das Leerzeichen nach td ist falsch.

      Und was soll an <td[^\v]*?> einfacher sein als an <td[^>]+>?

      🖖 Живіть довго і процвітайте

      PS: Übrigens versagt das alles, wenn > in einem Attributwert vorkommt.

      --
      „Im Vergleich mit Elon Musk bei Twitter ist ein Elefant im Porzellanladen eine Ballerina.“
      — @Grantscheam auf Twitter
      1. Hallo Gunnar,

        PS: Übrigens versagt das alles, wenn > in einem Attributwert vorkommt

        Wenn man Regex nutzt, wo ein Parser gebraucht wird, ist das der erwartbare Kollateralschaden.

        Ich habe mir verkniffen, das zu kommentieren, weil Jürgen eine sehr spezifische Anwendung hatte, in der das vermutlich unschädlich ist.

        Rolf

        --
        sumpsi - posui - obstruxi
        1. Hallo zusammen,

          Ich habe mir verkniffen, das zu kommentieren, weil Jürgen eine sehr spezifische Anwendung hatte, in der das vermutlich unschädlich ist.

          so ist es. Die Word-Dokumente liegen inzwischen als html vor.

          Es hat letztendlich viel mehr Arbeit gemacht, die Word-Eigenarten zu beandeln. Word neigt beim html-Export dazu, Sonderzeichen als &#nnnnnn; darzustellen, oder auch als Grafik. Auch Formeln waren teilweise als Grafik, teiweise als html exportiert. Dann neigt Word dazu, sehr großzügig mit <span>s umzugehen, und an aus meiner Sicht willkürlich gesetzten Stellen findet mann ein <a name="_Hlk123831769">...</a>. Aber genug gemeckert, das Problem ist gelöst.

          Noch mal: vielen Dank.

          Gruß
          Jürgen