#1 29. August 2010 aus HTML String einen link herausfiltern Hi, ich hab folgendes Problem: Ich will in Java (bin an einer Android App dran) aus einem String der verschiedene HTML Tags und auch normalen Text enthält aus nem <img> Tag den Source Link rausfiltern. Der String sieht etwa so aus: Code: <p>blablablblablabla<br /> blablablblablabla <img src=http://link.de/bild.png alt=bla title=bla width=220 height=380 class=alignnone size-medium wp-image-4777 /><br /> blablablblablabla<br /> <a href=http://irgendeinlink.de>link</a></p> einen regulären ausdruck hab ich eigentlich schon: <img(.*?) src=([^\"]*) (.*?)> nur finde ich in java bisher keine möglichkeit den link als String zu bekommen. Ich steh momentan etwas auf dem Schlauch kann mir vllt. jemand helfen? LG + Multi-Zitat Zitieren
#2 30. August 2010 AW: aus HTML String einen link herausfiltern Code: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class LinkGetter { private Pattern htmltag; private Pattern link; private final String root; public LinkGetter(String root) { this.root = root; htmltag = Pattern.compile("<a\\b[^>]*href=\"[^>]*>(.*?)</a>"); link = Pattern.compile("href=\"[^>]*\">"); } public List<String> getLinks(String url) { List<String> links = new ArrayList<String>(); try { BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(new URL(url).openStream())); String s; StringBuilder builder = new StringBuilder(); while ((s = bufferedReader.readLine()) != null) { builder.append(s); } Matcher tagmatch = htmltag.matcher(builder.toString()); while (tagmatch.find()) { Matcher matcher = link.matcher(tagmatch.group()); matcher.find(); String link = matcher.group().replaceFirst("href=\"", "") .replaceFirst("\">", ""); if (valid(link)) { links.add(makeAbsolute(url, link)); } } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return links; } private boolean valid(String s) { if (s.matches("javascript:.*|mailto:.*")) { return false; } return true; } private String makeAbsolute(String url, String link) { if (link.matches("http://.*")) { return link; } if (link.matches("/.*") && url.matches(".*$[^/]")) { return url + "/" + link; } if (link.matches("[^/].*") && url.matches(".*[^/]")) { return url + "/" + link; } if (link.matches("/.*") && url.matches(".*[/]")) { return url + link; } if (link.matches("/.*") && url.matches(".*[^/]")) { return url + link; } throw new RuntimeException("Cannot make the link absolute. Url: " + url + " Link " + link); } } Vllt kann dir das ja was helfen kannst ja code stücke aus der Methode nehmen. Ich hoffe ich hab deine Frage richtig verstanden xD mfg + Multi-Zitat Zitieren
#3 30. August 2010 AW: aus HTML String einen link herausfiltern Füg deinen Ausdruck oben ins Beispiel ein und du bekommst ein Array mit allen Treffers als Rückgabe. Wie du das ausliest sollte klar sein. Ich glaube Google hätte dir mit den Stichworten: Java, Regex, URL - auch geholfen. Und rushzero könnte auch mal Credits geben, man kopiert nicht irgendeinen Code ohne Erklärung: Java Regex - Tutorial + Multi-Zitat Zitieren
#4 30. August 2010 AW: aus HTML String einen link herausfiltern danke ich werd mal schaun ob ich damit weiterkomme + Multi-Zitat Zitieren
#5 30. August 2010 AW: aus HTML String einen link herausfiltern Code: htmltag = Pattern.compile("<a\\b[^>]*href=\"[^>]*>(.*?)</a>"); besser: Code: htmltag = Pattern.compile("<a.*href=\"[^\"]*\".*>(.*)</a>"); ---- Code: private String makeAbsolute(String url, String link) { if (link.matches("http://.*")) { return link; } if (link.matches("/.*") && url.matches(".*$[^/]")) { return url + "/" + link; } if (link.matches("[^/].*") && url.matches(".*[^/]")) { return url + "/" + link; } if (link.matches("/.*") && url.matches(".*[/]")) { return url + link; } if (link.matches("/.*") && url.matches(".*[^/]")) { return url + link; } throw new RuntimeException("Cannot make the link absolute. Url: " + url + " Link " + link); } besser: Code: private String makeAbsolute(String url, String link) { if(link.matches("^http://")) return link; if(link.charAt(0) == '/') { if(url.charAt(url.length) == '/') url = url.substring(0, url.length - 1); } else if(url.charAt(url.length) != '/') url += "/"; return url + link; } + Multi-Zitat Zitieren
#6 30. August 2010 AW: aus HTML String einen link herausfiltern müsste das nicht so aussehen? Code: htmltag = Pattern.compile("<a.*?href=\"[^\"]*\".*?>(.*?)</a>"); ohne die fragezeichen würde er bei 2 links hintereinander durcheinander kommen. + Multi-Zitat Zitieren
#7 31. August 2010 AW: aus HTML String einen link herausfiltern Du hast Recht. Über das gierige Verhalten von Regex bin ich auch schon des öfteren gestolpert. Die Fragezeichen sorgen dafür, dass die Regex "Maschine" aufhört, wenn das 1. Vorkommnis gefunden wird. Dadurch wird nicht bis zum Ende weitergesucht. greez + Multi-Zitat Zitieren
#8 31. August 2010 AW: aus HTML String einen link herausfiltern naja, da ein link nicht innerhalb eines links vorkommen sollte kann man das auch weglassen mmn. die einzige situation wo ggf. fehlerhaft wäre ist <a href="...">...</a>... <a name="...">...</a> probieren geht über studieren. + Multi-Zitat Zitieren