HTML String und regex

  • Themenstarter Themenstarter Annox
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
A

Annox

Gast
Hallo,
ich komme gerade nicht drumherum, einen html String zu "durchforsten" und das Attribute size zu ersetzen. HIntergrund ist der, dass das Attribute size in allen html Strings vorkommt und um 2 verkleinert werden muss... Mir fehlt ein bisschen das know How. Nehmen wir an, ich habe den folgenden html String gespeichert:


Code:
 <html>
  <head>    
  </head>
  <body bgcolor="#ccff00">
    <p style="margin-top: 0">
      <font face="Lucida Bright" size="6">Hallo Schorsch, </font>
    </p>
    <p style="margin-top: 0">
      <font face="Lucida Bright" size="6">Dies ist ein Test
</font>    </p>
    <p style="margin-top: 0">
      
    </p>
    <p style="margin-top: 0">
      
    </p>
    <p style="margin-top: 0">
      [i][b]<font size="5" face="Forte">Noch ein Test</font>[/b][/i]
    </p>
  </body>
</html>


Nun soll in dem gesamten String das Attribute size="\\D" um size="\\D-2" ersetzt werden. Jeder Wert wird also um 2 verkleinert, was in obigem Beispiel 2 mal den Wert 4 und 1 mal den Wert 3 bringen würde.
Dachte an einen solchen Ansatz, das haut aber nich so ganz hin ;(




Code:
String test = element.getHTMLText().replaceAll("size='\\D'", "size='2'");


Der 2. Parameter müsste nat. irgendwie dynamisch sein also immer 2 weniger als die aktuell gefundene Zahl

Hilfe
 
Hm, hab zwar noch nicht damit gearbeitet aber wenn das die bessere wahl ist...
schau ich mir mal an . Danke.
 
Wildcard hat gesagt.:
Willst du nicht lieber einen HTML Parser verwenden?
http://java-source.net/open-source/html-parsers

Na ja, erscheint mir für so eine Aufgabe ein wenig wie "mit Kanonen auf Spatzen schießen".

Hier für dich Annox ein Q&D-Ansatz, den du simpel um die Routine zum Austauschen ergänzen kannst:

Code:
package regex;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class SearchAndReplaceInHTML {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
    	String fileName;
    	if (args.length == 0) {
    		fileName = "My.html";
    	} else
    		fileName = args[0];
    	BufferedReader buffIn = new BufferedReader(new FileReader(fileName));
		String fileLine;
		int i = 0;
		while ((fileLine = buffIn.readLine()) != null) {
			//System.out.println(fileLine);
			String regex = "size=\"(.*?)\"";
			Pattern pattern = Pattern.compile(regex);
			Matcher matcher = pattern.matcher(fileLine);
			while (matcher.find()) {
				System.out.println("Match in line # "+i+": "+matcher.group());
			}
		++i;
		}
	}

}

Hth
 
abollm hat gesagt.:
Na ja, erscheint mir für so eine Aufgabe ein wenig wie "mit Kanonen auf Spatzen schießen".
Da gebe ich dir recht, aber gerade in HTML steht oft ziemlicher Müll drin. Ich wäre da vorsichtig und würde wohl einen Parser nehmen. Hängt aber natürlich auch davon ob wie kritisch die Sache ist und ob irgendwelche Aussagen über die Validität der Datei getroffen werden können.
 
Ah Cool, Danke. Ist vielleicth doch ein bisschen einfacher für mich.
 
Achso,

ja. Der html Code den ich da verarbeiten muss ist teilweise wirklich ziemlich aufgeblähter Müll (der wurde automatisch generiert). Aber, da er nicht weiter verwendet wird und die html Strings nie wirklich groß sind, geht das wohl schon in Ordnung.
 
Wildcard hat gesagt.:
Da gebe ich dir recht, aber gerade in HTML steht oft ziemlicher Müll drin. Ich wäre da vorsichtig und würde wohl einen Parser nehmen. Hängt aber natürlich auch davon ob wie kritisch die Sache ist und ob irgendwelche Aussagen über die Validität der Datei getroffen werden können.

Klar, sauber ist das da oben von mir sicher nicht. Deshalb hab ich ja auch mit voller Absicht Q&D-Lösung dazu geschrieben. Mit dem Müll in HTML-Dateien hast du ebenfalls Recht, aber meistens kann man durch ein "Quer-über-die-Datei-schauen" erkennen, was für eine Art HTML man hat.

Außerdem, wenn ich jedes Mal für relativ einfache Aufgaben die "formvollendete" Lösung nehmen würde, komme ich zeitlich so gut wie nie hin. Anders sieht die Sache natürlich aus, wenn man ähnliche Aufgaben immer wieder machen muss: Dann auf jeden Fall eine professionelle Lösung erstellen.
 
Annox hat gesagt.:
(der wurde automatisch generiert). Aber, da er nicht weiter verwendet wird und die html Strings nie wirklich groß sind, geht das wohl schon in Ordnung.
Dafür ist die Lösung von abollm sicherlich richtig.

@abollm
fully ack
 
Sorry,
in Anlehnung an die Quick & Dirty Methode hätte ich noch eine Frage. Was ist hier konkret Q D ?
bzw was heißt professionelle Lösung. Meint ihr damit, dass man dann eine Methode dafür schreibt, etwa in der Form

Code:
String parseAndReplace (File file, String tag, int value) {
  
   //parst eine html datei und setzt tag mit value

  return htmlText;
}


Meint ihr sowas ?
 
Annox hat gesagt.:
Sorry,
in Anlehnung an die Quick & Dirty Methode hätte ich noch eine Frage. Was ist hier konkret Q D ?
bzw was heißt professionelle Lösung. Meint ihr damit, dass man dann eine Methode dafür schreibt, etwa in der Form

Code:
String parseAndReplace (File file, String tag, int value) {
  
   //parst eine html datei und setzt tag mit value

  return htmlText;
}


Meint ihr sowas ?

Mit Quick & Dirty meinte ich, dass ich mit einem relativ simplen RegEx-Parsing die HTML-Datei Zeile für Zeile nach dem Auftreten des von dir angegebenen Strings durchsuche. Es kann so nicht grundsätzlich ausgeschlossen werden, bestimmte Repräsentationen von size =" zu übersehen oder ggf. nicht relevante Repräsentationen in beispielsweise Kommentarzeilen unnötig zu wandeln.

Professionell ist m.E eine Lösung immer dann, wenn sie auf möglichst langjährig erprobten und bewährten Verfahren beruht und somit mit sehr hoher Wahrscheinlichkeit alle denkbaren Fälle in der Praxis abdeckt. Insofern ist so ein HTML-Parser wie von Wildcard vorgeschlagen immer die solidere und saubere Lösung. Problem ist nur häufig die zur Verfügung stehende Zeit.

Das mit der Methide oben ist sicherlich gut und notwendig, aber IMO nicht hinreichend für eine prof. Lösung im hier beschriebenen Fall
 
Ich bräuchte mal Hilfe von den Regex-Künstlern

In einer HTML-Datei habe ich das body-Tag. Das würde ich gerne finden und tauschen.

z.B.:
String xyz = htmlString..replaceAll("<body>" , "<body irgendwas="..">");

Das geht ja auch. Nun kann es aber vorkommen, dass das body-Tag bereits Attribute hatte. Das habe ich dann so probiert.

z.B
String xyz = htmlString..replaceAll("<body.*>" , "<body irgendwas="..">");

geht auch wunderbar. Das Problem ist wenn in der Zeile mit dem body-Tag weitere HTML-Tags kommen.

<body att="..">
bla

Kann ich in Regex irgendwie sagen "bis zum ersten >" ?
 
Ok hab was.


Code:
String xyz = htmlString..replaceAll("<body>|<body[^>]+>" , "<body irgendwas="..">");
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben