# Strings von HTML befreien



## Dave (23. Jan 2010)

Hallo,

ich würde gerne wissen ob JAVA vom Hausaus iene möglichkeit bietet Strings von HTMLcode zu befreien ?

ich bezweifle aber dies deshalb habe ich eine andere Frage hat jemand vllt. ein gutes deutschsprachiges Tutorial wo beschrieben wird wie man Reuläre Ausdrucke erstellt?

ich würde zb. wissen wie ich in einem regex mehrere Wörter austauschen kann (replaceAll()).


Bäruchte sowas da ich von einer Internetseite kopierten Text aus der zwischanablage auslese und da nach bestimmten Schlüsselwörtern und deren Parametern suchen muss.

Bsp:

```
<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body><tr><td valign="top" width="30%">Schlüsselwort1:

              </td>

              <td valign="top" width="70%">ParameterVon1

          	</td>

  	 </tr>
  <tr>
<td height="1" valign="top" width="70%"><div id="tdetails" 
style="display: inline;"><div style="width: 150px; float: left;">Schlüselwort2:</div>
 ParameterVon2<br style="clear: left;"><div style="width: 150px; float: left;">Schlüsselwort3:</div>
.......
```

das war ein kleiner Ausschnitt von dem Text den ich auslese, wie ihr seht ändert sich die Position der Schlüsselwörter und Parameter, somit fählt das Zeilen und Zeichen genaue absuchen weg.

ich wollte jetzt einfach alle HTMLtags entfehrnen damit ich nur Schlüsselwörterarameter stehen habe aber das wird schwer da ich mit regex garkeien Erfahrung habe ^^


also meien Fargen lauten:

1 - Gibt es eine Java funktion die Strings von HTML befreit?
2 - Kennt jemand ein gutes deutschsprachigesTutorial für regex?
3 - Hat jemand vllt. eien andere idee wie ich mir die Schlüsselwörter und deren parameter von dem Text rausfiltern kann ?
LG


----------



## frapo (23. Jan 2010)

Also auf deutsch findet man leider nicht sooo viel zu Regex: Java Regular Expressions. Aber vielleicht hilft dir das ja schon weiter? 

Gruß
frapo


----------



## noobadix (23. Jan 2010)

Hallo, ich hab's mal ganz rudimentär gelöst, denke, es klappt:


```
import java.util.ArrayList;

class testing{
	public static void main(String[] args){
		testing t = new testing();
		ArrayList<String> inhalt = t.suche("<html><p>testtextleckerlecker</p><p>sehrlecker</p></html>");
		for(int i=0;i<inhalt.size();i++){
			System.out.println(inhalt.get(i));
		}
	}
	
	public ArrayList<String> suche(String st){
		ArrayList<String> ergebnis = new ArrayList<String>();
		for(int i=0;i<st.length();i++){
			String tmp = st.charAt(i)+"";
			if(tmp.equals(">")){
				if((i+1)<st.length()){
				String next = st.charAt(i+1)+"";
				if(!next.equals("<")){
					StringBuffer sb = new StringBuffer();
					String hit ="";
					int index = ++i;
					while(!hit.equals("<")){
						hit = st.charAt(index)+"";
						sb.append(hit);
						index++;
						hit = st.charAt(index)+"";
					}
					ergebnis.add(sb.toString());
				}
				}
			}
		}
		return ergebnis;
	}
}
```


----------



## noobadix (23. Jan 2010)

Naja, klappt nur, wenn aus dem HTML-Kod schon alle " entfernt sind. Müsste wissen, wie/als was das Zeug aus der Zwischenablage im Java-Kod anzutreffen ist.


----------



## Pfaeff (23. Jan 2010)

Mit RegEx wirst du, je nach dem was du vorhast bei HTML an die Grenzen stoßen. 
HTML (bzw. XML) ist nämlich nicht regulär (RegEx = Regular Expressions), sondern kontextfrei. 
Dafür würde sich zum Beispiel ein Kellerautomat besser eignen.


----------



## Dave (23. Jan 2010)

@frapo thx, hilft mir aufjedenfall weiter 

@noobadix,

bua guter Gedanke die <> und was zwischen dehnen ist zu löschen  

vielen vielen dank.


----------



## Landei (23. Jan 2010)

Probiere mal 
	
	
	
	





```
s.replaceAll("<.*?>", "");
```


----------



## noobadix (23. Jan 2010)

Landei hat gesagt.:


> Probiere mal
> 
> 
> 
> ...



Das funktioniert wunderbar, solange die HTML-Tags keinen Zeilenumbruch beinhalten. Hast du da auch noch ne Idee? Ich hab versucht nach selbem Prinzip alle " " oder "\n" rauszuholen, aber geklappt hat's nicht.


----------



## eRaaaa (23. Jan 2010)

mhm, hilft das vllt :

DOTALL


----------



## noobadix (23. Jan 2010)

Mit diesen Pattern/Matchern wollt ich nix zu tun haben...aber nach diesen freundlichen Tutorials ging es dann doch:
Java Regular Expressions

regex über mehrere Zeilen - Java @ tutorials.de: Forum, Tutorial, Anleitung, Schulung & Hilfe

Ergebnis:

```
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.awt.Toolkit; 
import java.awt.datatransfer.*;

class testing{
	public static void main(String[] args){
		Clipboard systemClipboard;
		systemClipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
		Transferable transferData = systemClipboard.getContents( null );
		for(DataFlavor dataFlavor : transferData.getTransferDataFlavors()){
			Object content = "";
		    try{
		    	content = transferData.getTransferData( dataFlavor );
		    }
		    catch(Exception e){}
		    if ( content instanceof String ){ 
		    	String contentString = (String) content;
		    	Pattern patt = Pattern.compile("<.*?>",Pattern.DOTALL);
		    	Matcher matcher = patt.matcher(contentString);
		    	while(matcher.find()){
		    		contentString = contentString.replace(matcher.group(), "");
		    	}
		    	System.out.println(contentString);
		        break;
		     }
		}
	}
}
```


----------



## ice-breaker (23. Jan 2010)

Dave hat gesagt.:


> @frapo thx, hilft mir aufjedenfall weiter
> 
> @noobadix,
> 
> ...




```
wie gut, dass niemand weiß, dass 1 < 2 ist und 3 > 2 ;)
```
einfach nur nach <> Ausschau zu halten reicht nicht.


----------



## noobadix (23. Jan 2010)

@Ice-Breaker:
Abgesehen von Kommentaren, was kann in HTML sonst noch schief gehen?


----------



## Landei (24. Jan 2010)

ice-breaker hat gesagt.:


> ```
> wie gut, dass niemand weiß, dass 1 < 2 ist und 3 > 2 ;)
> ```
> einfach nur nach <> Ausschau zu halten reicht nicht.



In _korrektem_ HTML würde das so geschrieben:

```
wie gut, dass niemand weiß, dass 1 &lt; 2 ist und 3 &gt; 2 ;)
```


----------



## Ebenius (24. Jan 2010)

Ich hätte übrigens noch einen solchen Ansatz, wenn Du das probieren möchtest. Weiß aber nicht, ob das für Dich sinnvoll ist:

```
final HTMLEditorKit kit = new HTMLEditorKit();
try {
  final Document doc = kit.createDefaultDocument();
  kit.read(new StringReader("<html><body>Huhu<p>Test</body></html>"),
        doc, 0);
  System.out.println(doc.getText(0, doc.getLength()));
} catch (Exception ex) {
  ex.printStackTrace();
}
```
Ebenius


----------



## ice-breaker (25. Jan 2010)

Landei hat gesagt.:


> In _korrektem_ HTML würde das so geschrieben:
> 
> ```
> wie gut, dass niemand weiß, dass 1 &lt; 2 ist und 3 &gt; 2 ;)
> ```


tja, dummerweise sind kaum Webseiten korrekt geschrieben. Die sind voller Fehler.


----------



## ben2000xx (25. Jan 2010)

Ich kann dir, wie Ebenius, auch SWING Empfehlen. Anbei das ganze in eine Klasse gepackt:


```
public class StringFilterHTML extends HTMLEditorKit.ParserCallback {
	StringBuffer s;

	public void parse(Reader in) throws IOException {
		s = new StringBuffer();
		ParserDelegator delegator = new ParserDelegator();
		delegator.parse(in, this, true);
	}

	public void parse(String string) throws IOException {
		StringReader in = new StringReader(string);
		s = new StringBuffer();
		ParserDelegator delegator = new ParserDelegator();
		delegator.parse(in, this, true);
	}

	public void handleText(char[] text, int pos) {
		s.append(text);
	}

	public String getText() {
		return s.toString();
	}

	public static void main(String[] args) {
		try {
			// the HTML to convert
			String html = "<HTML><HEAD></HEAD><BODY><b>Hello</b>&nbsp;World!<br></BODY></HTML>";
			StringFilterHTML parser = new StringFilterHTML();
			parser.parse(html);
			System.out.println(parser.getText());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
```

Habe gute Erfahrung damit gemacht. Aber dass es immer mal Probleme mit nicht validem HTML geben wird, wirst du wohl nicht umgehen können.

Ben


----------



## ice-breaker (25. Jan 2010)

ben2000xx hat gesagt.:


> Habe gute Erfahrung damit gemacht. Aber dass es immer mal Probleme mit nicht validem HTML geben wird, wirst du wohl nicht umgehen können.



eventuell vorher durch JTidy jagen, macht fast immer aus inkorrektem HTML richtig gute Ergebnisse.


----------



## noobadix (25. Jan 2010)

Hab da noch so nen Gedanken:
Könnte man vielleicht einen Browser auf Java-Basis, wenn es sowas gibt, aufbrechen und den, ich sag mal, stream, der zur Anzeige geht, also den interpretierten HTML-Kod, abfangen und diesen dann auf < und > untersuchen?

edit: den hier hab ich auf Anhieb gefindet: Lobo Project Java Source Code


----------

