HTML mit REGEXP bereinigen
JürgenB
- html
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
@@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.
🖖 Живіть довго і процвітайте
@@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?
🖖 Живіть довго і процвітайте
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
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
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
Hallo Gunnar,
danke, der Ausdruck bereinigt das HTML auch zeilenübergreifend (im noteoad++).
Gruß
Jürgen
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
Hi,
der ist zu gierig,
<td.*>
nimmt alles nach<td
dann sei halt nicht so gierig: <td.*?>
cu,
Andreas a/k/a MudGuard
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
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
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
@@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.
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
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