regular expressions
trunx
- javascript
Hallo Forum,
ich möchte gern gesetzte style-Attribute komplett löschen, da ich aber nicht genau weiß, was für Werte enthalten sind, wollte ich das mit regexp machen; aber ich begreife es nicht :-(
Im Prinzip will ich sagen, finde 'style="..."', also 'style="' und gehe bis zum nächsten '"', aber wie macht man das?
wäre schön, wenn mir jemand helfen könnte.
vielen Dank im voraus
bye trunx
Hallo trunx,
ich möchte gern gesetzte style-Attribute komplett löschen, ...
ein Regulärer Ausdruck, der ein XML-Attribut beschreibt, ist relativ komplex. Wenn du ein Attribut löschen willst, geht das am einfachsten per DOM.
Gruß Uwe
ich möchte gern gesetzte style-Attribute komplett löschen, ...
ein Regulärer Ausdruck, der ein XML-Attribut beschreibt, ist relativ komplex. Wenn du ein Attribut löschen willst, geht das am einfachsten per DOM.
auch dir vielen Dank, schaust du auch mal bitte https://forum.selfhtml.org/?t=171286&m=1121132hier[/link]?
bye trunx
@@trunx:
ich möchte gern gesetzte style-Attribute komplett löschen, […] [ich] wollte das mit regexp machen
Ähm nein, bei regulären Ausdrücken bist du falsch. Zum Löschen eines Attributs gibt es eine Methode.
Live long and prosper,
Gunnar
ich möchte gern gesetzte style-Attribute komplett löschen, […] [ich] wollte das mit regexp machen
Ähm nein, bei regulären Ausdrücken bist du falsch. Zum Löschen eines Attributs gibt es eine Methode.
sorry, ich hatte mich falsch ausgedrückt: ich habe in einem String html-Code, der auch style-Attribute enthält (für welche Tags weiß ich auch nicht) und diese möchte ich aus dem String entfernen; im ursprünglichen Quelltext sind sie nicht enthalten, daher bringt das Löschen auch nichts.
Daher denke ich nach wie vor, dass regular expressions eine sinnvolle Möglichkeit sind, diese Teilstrings zu entfernen/ersetzen.
bye trunx
Hallo,
ich habe in einem String html-Code, der auch style-Attribute enthält
Dann parse ihn und nutze das DOM.
Ein div-Element erzeugen, innerHTML setzen und dann alle Kindelemente (.getElementsByTagName("*")) durchlaufen und mit removeAttribute behandeln. Quellcode ist mit innerHTML wieder auslesbar bzw. du kannst die Elemente gleich im Dokument weiterverwenden.
Geht höchstwahrscheinlich schneller und zuverlässiger als RegExp-Gefummel.
Mathias
ich habe in einem String html-Code, der auch style-Attribute enthält
Dann parse ihn und nutze das DOM.
Ein div-Element erzeugen, innerHTML setzen und dann alle Kindelemente (.getElementsByTagName("*")) durchlaufen und mit removeAttribute behandeln. Quellcode ist mit innerHTML wieder auslesbar bzw. du kannst die Elemente gleich im Dokument weiterverwenden.
Geht höchstwahrscheinlich schneller und zuverlässiger als RegExp-Gefummel.
das war genau mein erster Ansatz - siehst du hier https://forum.selfhtml.org/?t=171258&m=1120790,
da ich damit aber nicht weiter komme/kam und im IE6 für iframes nur die write() Methode richtig funktioniert (bei mir jedenfalls), lese ich halt alles aus, doch der IE6 fügt ungefragt noch die style-Attribute ein, ich schmeiße sie wieder raus - nachdem was ich von amolip gelesen, verzichte ich dabei besser auf RegExp und mache dies mit meiner while-Schleife - und schreib das alles wieder in den iframe.
Warum aber dieser umständliche iframe? Ich bastle einen Webeditor (als ob es nicht genug gäbe - ich weiß *grins*) und die zu editierende Seite kommt eben da rein. Das was ich jetzt mache (also wahlweise das Problem mit innerHTML bzw. den style-Attributen), gehört zur Vorschau-Funktion, die Editor-Seite soll ohne tools (sprich Rahmen um die editierbaren Bereiche u.ä.) und tool-Leiste angezeigt werden...
so wie ich das jetzt mache, geht es, das ist ja wenigstens schon was, aber eine Lösung mit innerHTML wäre am elegantesten, naja
bye trunx
Hi,
ich möchte gern gesetzte style-Attribute komplett löschen, da ich aber nicht genau weiß, was für Werte enthalten sind, wollte ich das mit regexp machen; aber ich begreife es nicht :-(
Im Prinzip will ich sagen, finde 'style="..."', also 'style="' und gehe bis zum nächsten '"', aber wie macht man das?
Na ja, man bastelt sich einen Ausdruck, der erst mal style=" fordert (und ggf. auch noch whitespace davor), dann beliebig viele Zeichen, die nicht " sind (negierte Zeichenklasse), und dann noch mal ein " - und das ganze ersetzt man dann durch Nichts.
Wie sieht denn dein Ansatz aus, bzw. wie weit bist du bisher mit Hilfe der Dokumentation bzgl. regulaerer Ausdruecke in SELFHTML gekommen?
MfG ChrisB
Wie sieht denn dein Ansatz aus, bzw. wie weit bist du bisher mit Hilfe der Dokumentation bzgl. regulaerer Ausdruecke in SELFHTML gekommen?
mein Ansatz sieht bisher so aus:
[code:javascript]
while(str.indexOf(' style="')!=-1) {
var str_indexOf = str.indexOf(' style="');
var str_1 = str.substr(0,str_indexOf)
var str_2 = str.substr(str_indexOf+8,str.length);
str_2 = str_2.substr(str_2.indexOf('"')+1,str_2.length);
str = str_1 + str_2;
}
[/code]
mit anderen Worten, ich verwende keine regulären Ausdrücke, da ich davon leider bisher keine Ahnung habe :-( der Code oben funktioniert zwar, aber ich dachte, es wär mal an der Zeit an diesem Beispiel was über regexp zu lernen.
Ich schau mir morgen nochmal deine Hinweise zum Aufbau genauer an, jetzt geh ich ins Bett :-), ansonsten vielen Dank erstmal
bye trunx
Hallo trunx!
mit anderen Worten, ich verwende keine regulären Ausdrücke, da ich davon leider bisher keine Ahnung habe :-(
Na dann wird es Zeit, sich damit zu beschäftigen. Nehmen wir Christophs Tipp und setzen wir ihn um:
man bastelt sich einen Ausdruck, der erst mal style=" fordert (und ggf. auch noch whitespace davor),
\s*
^^^ matcht einen, keinen oder mehrere Leerzeichen (eher gesagt: whitespace)
style="
^^^^^^^ matcht so, wie angegeben, also genau: style="
dann beliebig viele Zeichen, die nicht " sind (negierte Zeichenklasse)
[^"]+?"
^^^^^^^ matcht alles, was kein »"« ist, bis zum schließenden »"«
Der gesamte Ausdruck sähe so aus:
/\s*style="[^"]+?"/gi
^ <- Begrenzer -> ^^^ g sucht »g«lobal und i »i«gnoriert Groß-/Kleinschreibung
Jetzt noch mal http://de.selfhtml.org/javascript/objekte/string.htm#replace@title=http://de.selfhtml.org/javascript/objekte/string.htm#replace dafür anwenden, und testen!
Mehr zur Syntax regulärer Ausdrücke <http://de.selfhtml.org/javascript/objekte/regexp.htm#allgemeines@title=im entsprechenden JavaScript-> oder http://de.selfhtml.org/perl/sprache/regexpr.htm@title=Perl-Kapitel. Dort kannst Du nachschlagen, was \s, *, +, ?, [^ und andere bewirken.
Viele Grüße aus Frankfurt/Main,
Patrick
Hallo Patrick!
Der gesamte Ausdruck sähe so aus:
/\s*style="[^"]+?"/gi
Nein, ganz so einfach ist es nicht.
<![CDATA[ style='background-color:Yellow' ]]>
Gruß Uwe
Hallo amolip!
<![CDATA[ style='background-color:Yellow' ]]>
Davon war im OP nicht die Rede, aber Du darfst den RegEx gerne erweitern ;)
Viele Grüße aus Frankfurt/Main,
Patrick
Hallo Patrick!
Davon war im OP nicht die Rede
Natürlich nicht, weil sich der Fragesteller der Fallstricke, die auf ihn lauern, nicht bewusst ist.
aber Du darfst den RegEx gerne erweitern ;)
Ok, du hast es so gewollt ;-)
< ([^\s/>]+)
( (?: \s+[^\s=]+ \s*=\s* (["'])[^<]*?\3 )*? )
( \s+(style) \s*=\s* (["'])([^<]*?)\6 )
( (?: \s+[^\s=]+ \s*=\s* (["'])[^<]*?\9 )*? )
\s*(/?)>
Die Leerraumzeichen sind nur wegen der Übersichtlichkeit da, sie gehören nicht zum Muster. Die Untermuster können, abhängig von dem was man genau will, angepasst werden.
Gruß Uwe
Natürlich nicht, weil sich der Fragesteller der Fallstricke, die auf ihn lauern, nicht bewusst ist.
aber Du darfst den RegEx gerne erweitern ;)
Ok, du hast es so gewollt ;-)
< ([^\s/>]+)
( (?: \s+[^\s=]+ \s*=\s* (["'])[^<]*?\3 )*? )
( \s+(style) \s*=\s* (["'])([^<]*?)\6 )
( (?: \s+[^\s=]+ \s*=\s* (["'])[^<]*?\9 )*? )
\s*(/?)>
puh, ich bleibe wohl besser erstmal bei meiner while-Schleife, obwohl ich allerdings glaube, hier wurde mit Spatzen auf Kanonen geschossen...:-)
trotzdem vielen Dank (zum Hintergrund - siehe hier: https://forum.selfhtml.org/?t=171286&m=1121331)
bye trunx
Hallo trunx!
puh, ich bleibe wohl besser erstmal bei meiner while-Schleife, obwohl ich allerdings glaube, hier wurde mit Spatzen auf Kanonen geschossen...:-)
Nein - ich kann doch nichts dafür, dass es nun mal so ist, wie es ist :-)
Ein String, der formal einem Attribut entspricht kann nun einmal nicht nur als Attributknoten auftreten, sondern beispielsweise auch in einem CDATA-Knoten. Und deswegen wird es komplex. Es geht bei einem Regulären Ausdruck ja nicht nur darum, das zu treffen, was man treffen will, sondern auch immer darum das nicht zu treffen, was man nicht treffen will. Man muss zwingend einen Elementknoten beschreiben, damit man wirklich nur Attribute trifft. Und "innerhalb" des Elementknotens, dann das gewünschte Attribut, wobei davor und dahinter weitere Attribute stehen können.
Aaaaaber, du kannst das vereinfachen, wenn, aber nur wenn, du sagen kannst »Ein String, der formal einem Attribut entspricht, kommt tatsächlich nur als Attributknoten vor«.
Dann könntest du einfach folgendes Muster nehmen:
»s+ style \s*=\s* (["'])[^<]*?\1«
Wenn du das nicht ausschliessen kannst, dann könntest du noch folgendes machen, zuerst alle Elementknoten (Starttags), die Attribute haben, auswählen ...
»< [^\s/>]+ (?: \s+[^\s=]+ \s*=\s* (["'])[^<]*?\1 )* \s*/?>«
... und diese dann in einer Schleife durchlaufen und die style-Attribute entfernen. Und natürlich noch den Original-Elementknoten durch den veränderten Elementknoten ersetzen.
Aber wie bereits mehrfach gesagt wurde, am einfachsten geht so etwas per DOM.
Gruß Uwe
@@amolip:
/\s*style="[^"]+?"/gi
Nein, ganz so einfach ist es nicht.
Da werf ich noch
<foo style = "bar: baz">
in die Runde.
Live long and prosper,
Gunnar
Hallo Gunnar!
Da werf ich noch
<foo style = "bar: baz">
in die Runde.
Glaub es oder nicht, im RegEx, das ich auf der Perl-Konsole getestet habe, hatte ich das noch:
style\s*=\s*
:)
Viele Grüße aus Frankfurt/Main,
Patrick
Hallo Gunnar,
Da werf ich noch
<foo style = "bar: baz">
in die Runde.
Und ich schmeiß noch ...
<p style='background-color:Yellow'>style='background-color:Yellow'</p>
... hinterher ;-)
Gruß Uwe