Alle Links in einem Text suchen und ersetzen mit einem neuen Link

beta20

Top Contributor
Hallo,

ich möchte gerne folgendes implementieren:
- Alle Links sollen in einem Text gesucht werden
- Jeder Link soll dann mit einem neuen Link ersetzt werden (replace Methode)

a) Wie suche ich die Links?
Welche verschiedenen "Linkformen" muss ich beachten.

www.domain.com
domain.com

Ich hätte gerne eine Methode wie diese:

b) Wie baue ich die Methoden auf? Ich brauche doch erst mal eine Methode, die mir alle Links sucht und dann in eine Liste speichert? Danach ersetzte ich den Original Link und füge ihn wieder in den Text ein?

Vielen Dank für jede Hilfe
 
Wo willst du alle Links ersetzen? In einem HTML Dokument? Grundsätzlich ist das nicht trivial und eigentlich auch fast unmöglich ohne entsprechende Bibliotheken, den Links können beliebig komplex mit Javascript maskiert werden.

Wenn man das mal außen vor lässt, muss man nach a-tag suchen und da das Attribut href auswerten: https://wiki.selfhtml.org/wiki/HTML/Textauszeichnung/a nach was genau du suchst, und was du ersetzt haben willst, musst du wissen.
 
Wo willst du alle Links ersetzen? In einem HTML Dokument? Grundsätzlich ist das nicht trivial und eigentlich auch fast unmöglich ohne entsprechende Bibliotheken, den Links können beliebig komplex mit Javascript maskiert werden.

Wenn man das mal außen vor lässt, muss man nach a-tag suchen und da das Attribut href auswerten: https://wiki.selfhtml.org/wiki/HTML/Textauszeichnung/a nach was genau du suchst, und was du ersetzt haben willst, musst du wissen.

Der Text kann ein ganz normaler String sein (also kein HTML). Es kann aber auch ein HTML Text sein.
Nach href zu suchen würde daher nur bei letzterem funktionieren.
 
Dann ist also jedes Vorkommen, welches ein Schema wie [Protokoll]://[Server[😛ort]][/some/path] hat, ein Link für Dich, den Du ersetzen willst.

Damit könnte man z.B. einen Regulären Ausdruck bauen, der die alle findet. Dann ist es egal, ob es eine Textdatei ist oder HTML oder was auch immer.

Wenn Du die einmal alle hast, kannst Du ein einfaches Suchen / Ersetzen laufen lassen, so dass Du alles suchst und ersetzt.

Evtl. kannst Du es ja auch noch etwas einschränken, also Protokoll nur http und https und so ...
 
Ja, genau... Im Prinzip ja. Eine Unterscheidung zwischen http / https brauche ich nicht...

Wie würde so ein Regex Ausdruck aussehen?
 
Also einen ganz einfachen würde ich dann z.B. so aufbauen:
(https|http)+:\/\/(\w[a-zA-Z0-9-_.]*)+(:\d*|)(\/\S*|)

Das sind also:
- ein https oder http
- ://
- Ein Name (optional), der mit einem Zeichen anfangen muss und dann noch Zeichen,Ziffern,.-_ haben kann ..
- Optional der Port
- Optional noch ein / mit non whitespaces

Nicht optimal, aber da findet man auf SO bestimmt noch besseres ...
 
Ok, danke... Aber wie mache ich dann die Suche konkret?
Brauche ja sowas in der Art. Bin mir aber nicht sicher, ob das mit dem Replace, Pattern und Matcher so passt? Die zweite Methode wird natürlcih angepasst, dass ein richtiger Link entsteht, habe jetzt nur mal zum Testen einen statischen Link verwendet (123456).

Java:
public String replaceLinks(String originalText){

        // 1. Nach Links suchen
        String linkRegex = "[(http(s)?):\\/\\/(www\\.)?a-zA-Z0-9@:%._\\+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_\\+.~#?&//=]*)";
        Pattern p = Pattern.compile(originalText);
        Matcher m = p.matcher(linkRegex);

        while (m.find()) {
            bodyText.replace(m.group(), m.replaceAll(m.group()));
        }
        return bodyText;
}



private String generateNewLink(String originalLink){
String newLink= "123456";
return newLink;
}
 
Habe den Code etwas angepasst...

Java:
public String replaceLinks(String originalText){

        // 1. Nach Links suchen
        String linkRegex = "[(http(s)?):\\/\\/(www\\.)?a-zA-Z0-9@:%._\\+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_\\+.~#?&//=]*)";
        Pattern p = Pattern.compile(originalText);
        Matcher m = p.matcher(linkRegex);

        while (m.find()) {
            originalText.replace(m.group(), m.replaceAll(m.group()));
        }
        return originalText;
}



private String generateNewLink(String originalLink){
    String originalLink= "123456";
    return originalLink;
}
 
Ok, danke.... Dann machen wir Schritt für Schritt...
Wie muss ich das aber in der Schleife machen, dass ich den Link dann bekomme?

Das geht so nicht?
Java:
    while (m.find()) {

           String originalLink = m.group(1);
            // Danach dann replace
        }
 
Ok, ich habe es mir doch nochmal überlegt....
Ich brauche nur den Link im HREF... wie kann ich diesen bekommen und dann ersetzen?
 
Man kann es so machen:
Code:
String anfang="";
String ende ="";
String originalLink="";
while (m.find()) {
originalLink=originalText.substring(m.start(),m.end());
    anfang=originalText.substring(0,m.start());
    ende=originalText.substring(m.end(),originalText.length());

originalText=anfang.concat(generateNewLink( originalLink)).concat(ende);
}
 

Zurück
Oben