Archiv verlassen und diese Seite im Standarddesign anzeigen : attribute width aus HTML filtern
Octophon
22.10.2008, 10:04
Hallo Leute,
so ich kann nicht mehr. Ich hab auch schon mal in der Suche geschaut, aber niemand hatte bisher das Problem das ich habe, bzw. hab ich's nicht gefunden. ;)
Ich möchte statische größenangaben aus HTML Tags entfernen. Z.B. width="200px". Aber nur statische Wert. Statische werte sind in,mm,cm,pt,px,pc oder eine zahl ohne Einheit. Dann wird standard px als einheit genommen. Dynamische Werte wie em oder % sollen nicht gefunden werden.
so sieht mein Testcode aus:
<table width="200%">
<table width="200pt">
<table width="200px">
<table width="200">
<table width="10em">
<table width= 200>
<table width=10em>
<table width=200px>
<table width=10% >
Und das ist mein Regex, dass ich bisher habe:
(width=['|"]?\s*(\d{1,}pt|\d{1,}px)['|"]?)|(width=['|"]?\s*(\d{1,})[^\w%]['|"]?)
Soweit klappt das auch ganz gut, ich hab nur mit dem Wert <table width= 200> noch Probleme. Hier wird auch immer noch die ">" nach der Zahl gefunden und ich hab schon so viel rumprobiert.
Vielleicht kann mal ein Profi drauf gucken und was dazu sagen.
Zum testen der Regex nehme ich den Regex coach 0.92.
Gruß Octophon
Firefall
22.10.2008, 11:19
WIe wärs mit
width=('|")?\d+(in|mm|cm|pt|px|pc)?\1
Das \1 ist eine Backreference zum ersten Submatch, also dem Teil ('|"). Es muss dort ein ' oder ein " vorkommen, aber entweder muss eines oder gar keins vorkommen (Aufgrund des folgenden ?). Am Ende bei \1 wird dann das dort ausgewählte Zeichen eingesetzt . Oder halt gar keins. Deine Methode matcht auch:
width="100px'Anschliessend soll mindestens eine Zahl kommen, danach eine der Massangaben, die gar nicht oder einmal vorkommt. Somit werden Zahlen ohne Massangabe gematcht.
Octophon
22.10.2008, 11:23
Habs nochmal verbesser, bzw. den mitleren teil etwas sauberer geschrieben :
(width=[''|"]?\s*(\d+[pt|px|pc|in|mm|cm])[''|"]?)|(width=[''|"]\s*(\d{1,})[''|"])
Octophon
22.10.2008, 11:32
wenn ich den Code in regex Coach eingebe findet er nur folgende:
<table width="200pt">
<table width="200px">
<table width="200">
Es fehlen noch
<table width= 200>
<table width=200px>
Wobei die eigentlich mit gefunden werden sollten. Kann es sein, dass dieser regex coach manche Sachen nicht richtig auswertet?
Die Backreference is noch ne gute Sache, werde ich benutzen.
Octophon
22.10.2008, 12:04
hab das mit der Backreference nochmal getestet, das scheint nicht so ganz zu klappen.
width=('|")?\d+(in|mm|cm|pt|px|pc)?\1
findet width="100px' nicht
width=('|")?\d+(in|mm|cm|pt|px|pc)?('|")?
dagen schon
Firefall
22.10.2008, 12:59
hab das mit der Backreference nochmal getestet, das scheint nicht so ganz zu klappen.
width=('|")?\d+(in|mm|cm|pt|px|pc)?\1
findet width="100px' nicht
width=('|")?\d+(in|mm|cm|pt|px|pc)?('|")?
dagen schon
Das war doch die Idee. width="100px' ist keine valide Syntax und sollte daurm nicht gematcht werden. Kann sein, dass dein Testprogramm nicht so toll läuft. Wo willst du denn den AUsdruck schlussendlich anwenden?
Octophon
22.10.2008, 15:01
mein Fehler. Ich hab die Backreferenz falsch verstanden. Dachte, dass es den gesamten Code aus der ersten gruppe nimmt, aber is jetzt klar. ;)
Die Backreferenz ist an der stelle nicht ganz von nöten, da mit manuellen eingaben auch width="200px' vorkommen könnte.
Ich brauche das ganze um HTML Quelltext zu kontrollieren und eben diese statischen Größenangaben zu finden und dann eine Meldung auszugeben. Dann kann man entscheiden, ob man die Sachen automatisch enfernen möchte. Wüfür ich dann das selber regex verwenden wollte um die gefundenen Stellen mit nix zu ersetzten. Das ganze passiert mit ColdFusion, das ist eine PHP ähnliche Scriptsprache.
Firefall
22.10.2008, 15:53
mein Fehler. Ich hab die Backreferenz falsch verstanden. Dachte, dass es den gesamten Code aus der ersten gruppe nimmt, aber is jetzt klar. ;)
Die Backreferenz ist an der stelle nicht ganz von nöten, da mit manuellen eingaben auch width="200px' vorkommen könnte.Eine Seite in der das vorkommt ist nicht valide. Wie gesagt.
Ich brauche das ganze um HTML Quelltext zu kontrollieren und eben diese statischen Größenangaben zu finden und dann eine Meldung auszugeben. Dann kann man entscheiden, ob man die Sachen automatisch enfernen möchte. Wüfür ich dann das selber regex verwenden wollte um die gefundenen Stellen mit nix zu ersetzten. Das ganze passiert mit ColdFusion, das ist eine PHP ähnliche Scriptsprache.Jep, HTML ist schon klar. ColdFusion haate ich mal vor ein paar Jahren installiert, aber keine Ahnung mehr.
Ich hab's jetzt mal bei mir getestet und folgender Ausdruck macht das was du willst, bis auf die Masslosen einheiten:
width=('|")?\d+(in|mm|cm|pt|px|pc)\1Die Schwäche war beim Fragezeichen nach den Massangaben, weil du Hochkommata nicht voraussetzt. Das ganze kannst du jetzt in ne Klammer stecken und dann noch einen OR-Fall für ne width ohne Massangaben hinzufügen, und dann geht das.
Octophon
22.10.2008, 17:26
jau danke soweit:
Also ich hab das noch ein bischen erweitert:
Teil 1:
width\s*=\s*(['|"]?)\s*\d+(in|mm|cm|pt|px|pc)\s*\1
findet jetzt:
width="200pt"
width="200px"
width=200px
width = " 200px "
Teil 2:
width\s*=\s*([''|"])\s*(\d+)\s*\1
findet jetzt:
width="200"
width = " 200 "
Soweit so gut: alles mit Oder verbunden ist schon mal cool, wäre da nicht dieses verdammte width=200 das bekomme ich einfach nicht ohne dass ich noch andere mit bekomme.
Meine Idee war:
damit findet er aber auch:
width=10em
width=10% >
width=200>
er soll aber width=10em nicht finden. Jetzt kann ich noch ([^\w%]) dran hängen, dann ist "width=10em" und "width=10%" draußen. Gut Gut, aber jetzt ist der string den er findet "width=200>". Er soll aber nur width=200 finden, denn sonst ersetzt er später das ">" auch durch nix. Ich glaube schon fast, dass man das nicht in einer regex machen kann.
Sonst muss ich das Ersetzten vielleicht in mehreren Runden machen. Also width\s*=\s*\d+([^\w%]) durch \1 ersetzen. und die Ersten beiden Teile durch nix.
keine Ahnung. Ich mach für heute erstmal schluß mit dem Mist.
;)
vBulletin® v3.8.6, Copyright ©2000-2012, Jelsoft Enterprises Ltd.