Namen von HTML YouTube Link in WebView ändern

  • Antworten:15
  • Bentwortet
Mike Hopeman
  • Forum-Beiträge: 31

14.01.2014, 15:18:50 via Website

Hi,

ich parse einen RSS Feed und erhalten dort unter anderem einen String, der manchmal Links zu YouTube Videos enthält. Ich kann diese URL bereits raus parsen. Ich will, dass alle YT Links durch den Text "Link zum Video" in der WebView ersetzt werden, der Link zum Video sollte durch einen Klick auf diesen Text aufgerufen werden.

Es wird mir zwar der Text" Link zum Video" angezeigt, der Link führt aber auch zu diesem String.

So sieht mein Code bisher aus:

[code]String description = fFeed.getItem(fPos).getDescription();

// get all links from the description string
ArrayList<String> links_in_string = retrieveLinks(description);
Log.d("debug", "All Links: " + links_in_string.toString());

// search for YouTube links
ArrayList<String> resList = new ArrayList<String>();
String searchString = "Kann als neues Mitglied keine YT Links angeben=";

for (String curVal : links_in_string) {
if (curVal.contains(searchString)) {
resList.add(curVal);
}
}
Log.d("debug", "YouTube Links: " + resList.toString());

// convert to single YouTube URL strings and replace
// them in the description string
Object[] mStringArray = resList.toArray();
for (int i = 0; i < mStringArray.length; i++) {
Log.d("string is", (String) mStringArray[i]);
description = description.replace((String) mStringArray[i],
"Link zum Video");
}


/**
* Retrieve all the links from the description string
* of the RSS Feed
*/
private ArrayList<String> retrieveLinks(String text) {
ArrayList<String> links = new ArrayList<String>();

String regex = "\\(?\\b(h[.])[-A-Za-z0-9+&@#/%?=~_()|!:,.;]*[-A-Za-z0-9+&@#/%=~_()|]";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(text);
while (m.find()) {
String urlStr = m.group();
if (urlStr.startsWith("(") && urlStr.endsWith(")")) {
urlStr = urlStr.substring(1, urlStr.length() - 1);
}
links.add(urlStr);
}
return links;
}[/code]

Antworten
Christian
  • Forum-Beiträge: 307

15.01.2014, 18:25:45 via App

hi,
na wenn du die description-list eins zu eins an die WebView übergibst dann ersetzte doch die YT URL mit eine Link-Tag.

Beispiel:
1<a href="YT-link">Link zum Video</a>

Oder versteht ich dich da falsch?

MFG Christian

— geändert am 15.01.2014, 18:29:00

Antworten
Mike Hopeman
  • Forum-Beiträge: 31

15.01.2014, 20:15:16 via Website

Ja ich dachte auch zuerst, dass es so funktioniert. Ich habe folgendes implementiert:

[code]description = description.replace((String) mStringArray[i], Html.fromHtml("<a href=\""+(String) mStringArray[i]+"\">Link zum Video</a>"));[/code]

Die Weiterleitung zum Link ist aber dann noch immer fehlerhaft, und führt zu "Link zum Video"

Noch eine Idee, was ich falsch mache?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

15.01.2014, 21:15:58 via App

Was ist der inhalt des Stringarrays?
Da wird wohl nichts brauchbares drinnestehen sonst würde es funktionieren.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Mike Hopeman
  • Forum-Beiträge: 31

15.01.2014, 21:18:41 via Website

LogCat gibt Folgendes aus:

01-15 21:17:13.640: D/string is(12187): .youtube.com/watch?v=urgILLOZokg
01-15 21:17:13.640: D/string is(12187): youtube.com/watch?v=urgILLOZokg
01-15 21:17:13.640: D/string is(12187): .youtube.com/watch?v=urgILLOZokg

Ich kann als neues Mitglieder vorerst keine Links auf externe Webseiten veröffentlichen, daher fehlt das htt und ww davor.

Antworten
Mike Hopeman
  • Forum-Beiträge: 31

17.01.2014, 20:30:07 via Website

Also ich kann den Fehler nun mehr eingrenzen:

Der String im RSS Feed sieht wie folgt aus:
1<a href=youtube.com/watch?v=5drSYII5mFY">youtube.com/watch?v‌​=5drSYII5mFY</a>

Also zweimal die selbe URL im Hyperlink. Wenn ich also diese URL ersetze, ersetze ich es an beiden Stellen und der Hyperlink sieht so aus:
1<a href="Link zum Video">Link zum Video</a>

Also muss ich nur jeden zweiten String ersetzen. Ich habe es mit folgendem Code versucht, leider ersetzt er nun den String gar nicht mehr. Es wird also der ursprüngliche Hyperlink ausgegeben:

[code]// convert to single YouTube URL strings and replace
// them in the description string
Object[] mStringArray = resList.toArray();
for (int i = 0; i < mStringArray.length; i++) {

//replace every second URL by "Link zum Video"
StringBuffer sb = new StringBuffer();
Pattern p = Pattern.compile((String) mStringArray[i]);
Matcher m = p.matcher(description);
int count = 0;
while (m.find()) {
if (count++ % 2 != 0) {
m.appendReplacement(sb, "Link zum Video");
}
}
m.appendTail(sb);
description = sb.toString();

Log.d("debug", "Description with replaced link: " + description);
}[/code]

Jemand ne Idee wo mein Fehler liegt?

P.S: Ja ich bin zu blöd zum Formatieren meines Codes, ich check das ned...

— geändert am 17.01.2014, 20:30:49

Antworten
impjor
  • Forum-Beiträge: 1.793

17.01.2014, 23:40:33 via App

Sollte mir RegEx einfacher gehen:

1String pattern = "(<a href=/".*?/">).*?(</a>)"
2deinQuelltext.replaceAll(pattern, "$1Link zum Video$2");

Ist jetzt ungetestet, musst du eventuell nochmal nachbessern. Sollte auf jeden Fall besser sein, als selber den Quelltext zu zerlegen.

Tutorial zu RegEx: http://www.vogella.com/tutorials/JavaRegularExpressions/article.html

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Mike Hopeman

Antworten
Christian
  • Forum-Beiträge: 307

18.01.2014, 15:52:46 via Website

Hi,

1.) Wenn es geht solltest du den Weg von impjor wählen da er um einiges sauberer ist.

2.)
Also wenn das
1<a href=youtube.com/watch?v=5drSYII5mFY">youtube.com/watch?v‌​=5drSYII5mFY</a>

so in deiner Variable "description" steht warum erstetzt du es nicht einfach mit:
1<a href=youtube.com/watch?v=5drSYII5mFY">Link zum Video</a>

Ist jetzt ungetestet:

[code]

Object[] mStringArray = resList.toArray();

for (int i = 0; i < mStringArray.length; i++) {

Log.d("string is", (String) mStringArray[i]);

String oldLink = "<a href=\""+ (String) mStringArray[i]) + "\">"+ (String) mStringArray[i]) + "</a>";
String newLink = "<a href=\""+ (String) mStringArray[i]) + \"">Link zum Video</a>";

description = description.replace(oldLink,newLink);

}

[/code]

mfg Christian

Mike Hopeman

Antworten
Mike Hopeman
  • Forum-Beiträge: 31

18.01.2014, 20:42:44 via Website

impjor
Sollte mir RegEx einfacher gehen:

1String pattern = "(<a href=/".*?/">).*?(</a>)"
2deinQuelltext.replaceAll(pattern, "$1Link zum Video$2");

LG

Das klingt gut, chekce die Formel in Pattern aber nicht wirklich und Eclipse schmeisst nen Fehler, dass der Operator / unknown ist. Einen Strichpunkt habe ich bereits an das Ende der ersten Zeile angefügt.

Antworten
impjor
  • Forum-Beiträge: 1.793

18.01.2014, 21:42:44 via App

Ja, die Slashs sind falsch herum, müssen natürlich Backslashs sein. Also grob gesagt geht das so:

Teile in Klammern () können später in replaceAll wiederverwertet werden. $1 ist das erste Klammernpaar usw.
Dann folgt halt der Link, der gefunden werden soll:
<a href="IRGENDWAS">IRGENDWAS</a>

Irgendwas wird ersetzt durch .*
. steht für ein beliebiges Zeichen, * für beliebig oft. Also beliebig oft ein beliebiges Zeichen.
Das Fragezeichen am Ende steht dafür, die Kürzeste Version zu finden. Sonst würde .* vom ersten Hyperlink, bis zum letzten all den Text repräsentieren. Durch das Fragezeichen gerade so viel Text, bis beim href ein "> und im Link </a> wieder gefunden wird.

So ergibt sich für das Pattern (<a href=".*?">).*?(</a>)

Da das ja alles in einen String soll müssen die Anführungszeichen "escaped" werden, weil Java sonst denkt, das wäre das Ende vom Pattern-String. Statt " also \"

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Mike Hopeman

Antworten
impjor
  • Forum-Beiträge: 1.793

18.01.2014, 21:57:09 via Website

Gerade nochmal getestet, klappt alles wunderbar.
Kleiner Fehler:
Statt
deinQuelltext.replaceAll
1deinQuelltext = deinQuelltext.replaceAll
Der String, auf den man replaceAll ausführt, wird nicht ersetzt, sondern man bekommt den ersetzten String zurück, genau wie bei replace(...).

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Mike Hopeman

Antworten
Mike Hopeman
  • Forum-Beiträge: 31

18.01.2014, 22:06:14 via Website

Wow super, das funktioniert! Du bist der Beste! Zwei Codezeilen mit so großer Wirkung! Danke für die Hilfe!

impjor

Antworten
Mike Hopeman
  • Forum-Beiträge: 31

18.01.2014, 22:43:59 via Website

Oh nun habe ich bemerkt, dass manchmal im Text auch Bilder als Hyperlink drinstehen, die werden dann auch mit "Link zum Video" ersetzt. Das soll natürlich nicht sein, sondern nur bei YouTube Videos.

Also müsste ich noch zusätzlich nach http://www.youtube.com/watch?v= im Hyperlink abfragen. Kannst du mir dabei nochmal helfen, dann bist du mich los ;-)

Antworten
impjor
  • Forum-Beiträge: 1.793

19.01.2014, 12:17:41 via App

Dann entsprechend:
(<a href="http://youtube.*?">).*?(</a>)

Ich denke mal, du hast immer ein YT-Link, wenn die Adresse mit youtube beginnt.

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Mike Hopeman
  • Forum-Beiträge: 31

19.01.2014, 13:53:55 via Website

Dank dir, das ist meine endgültige Lösung um alle YouTube Links durch "Link zum Video" zu ersetzen.

1String pattern = "(<a href=\"http://www.youtube.*?>).*?(</a>)";
2 description = description.replaceAll(pattern, "$1Link zum Video$2");

Antworten