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

Diskutiere Alle Links in einem Text suchen und ersetzen mit einem neuen Link im Java Basics - Anfänger-Themen Bereich.
B

beta20

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
 
L

LimDul

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.
 
B

beta20

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.
 
J

JustNobody

Dann ist also jedes Vorkommen, welches ein Schema wie [Protokoll]://[Server[:port]][/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 ...
 
B

beta20

Ja, genau... Im Prinzip ja. Eine Unterscheidung zwischen http / https brauche ich nicht...

Wie würde so ein Regex Ausdruck aussehen?
 
J

JustNobody

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 ...
 
B

beta20

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\\.)[email protected]:%._\\+~#=]{2,256}\\.[a-z]{2,6}\\b([[email protected]:%_\\+.~#?&//=]*)";
        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;
}
 
F

fhoffmann

In deinem Beispiel ist bodyText undefiniert.
Poste doch bitte mal compilierbaren Code.
 
B

beta20

Habe den Code etwas angepasst...

Java:
public String replaceLinks(String originalText){

        // 1. Nach Links suchen
        String linkRegex = "[(http(s)?):\\/\\/(www\\.)[email protected]:%._\\+~#=]{2,256}\\.[a-z]{2,6}\\b([[email protected]:%_\\+.~#?&//=]*)";
        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;
}
 
B

beta20

Ja, hier bin ich mir eben nicht ganz sicher wie ich die untere Methode aufrufen soll mit welchen Parametern
 
B

beta20

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
        }
 
B

beta20

Ok, ich habe es mir doch nochmal überlegt....
Ich brauche nur den Link im HREF... wie kann ich diesen bekommen und dann ersetzen?
 
Dimax

Dimax

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);
}
 
Thema: 

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

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben