Avatar billede roo104 Nybegynder
26. august 2004 - 14:31 Der er 19 kommentarer og
1 løsning

www til hyperlink

Jeg har lavet en metode som kan lave www.eksperten.dk til <a href="www.eksperten.dk">www.eksperten.dk</a> som også virker fint nok lige indtil jeg henter teksten ind fra en mysql database og der er linjeskift i teksten.
Hvordan får jeg den til at acceptere linjeskift ?

public static String encodeHtml(String tag) {
        StringTokenizer st = new StringTokenizer(tag);
        StringBuffer sb = new StringBuffer();
        while(st.hasMoreTokens()) {
            String s = st.nextToken();
            if(s.toLowerCase().startsWith("http://")) {
                sb.append("<a href=\"");
                sb.append(s);
                sb.append("\">");
                sb.append(s);
                sb.append("</a> ");
            }
            else if(s.toLowerCase().startsWith("www.")) {
                sb.append("<a href=\"http://");
                sb.append(s);
                sb.append("\">");
                sb.append(s);
                sb.append("</a> ");
            }
            else
                sb.append(s+" ");
        }
        return sb.toString();
    }
Avatar billede arne_v Ekspert
26. august 2004 - 14:39 #1
Det virker da sådan set fint nok.

Linie skiftene forsvinder bare.
Avatar billede arne_v Ekspert
26. august 2004 - 14:40 #2
Hvis du bruger:

      StringTokenizer st = new StringTokenizer(tag, " ");

så beholder du dem.
Avatar billede roo104 Nybegynder
26. august 2004 - 14:46 #3
Ja det virker lige til jeg kalder metoden fra en jsp side.
<%= EncodeHtml.encodeHtml(rs.getString("nyhed_tekst")) %>
Alt efter linjeskift bliver ikke lavet til hyperlinks.
fx. vil denne tekst ikke lave hyper link.

her er en tekst med linjeskift www.eksperten.dk
www.eksperten.dk

den første www.eksperten.dk bliver til hyperlink men ikke den i anden linje
Avatar billede arne_v Ekspert
26. august 2004 - 14:52 #4
Det har du sgu da ret i.

Men prøv med:

        StringTokenizer st = new StringTokenizer(tag.replace('\n',' '), " ");
Avatar billede roo104 Nybegynder
26. august 2004 - 15:15 #5
Jeg ville gerne beholde newline, dem mister jeg jo nu.
Avatar billede roo104 Nybegynder
26. august 2004 - 15:19 #6
Jeg splitter jo hele strengen op og samler den med StringBufferen igen :(
Avatar billede arne_v Ekspert
26. august 2004 - 15:19 #7
public static String encodeHtml(String tag) {
        StringTokenizer st = new StringTokenizer(tag, "\n ", true);
        StringBuffer sb = new StringBuffer();
        while(st.hasMoreTokens()) {
            String s = st.nextToken();
            if(s.toLowerCase().startsWith("http://")) {
                sb.append("<a href=\"");
                sb.append(s);
                sb.append("\">");
                sb.append(s);
                sb.append("</a>");
            }
            else if(s.toLowerCase().startsWith("www.")) {
                sb.append("<a href=\"http://");
                sb.append(s);
                sb.append("\">");
                sb.append(s);
                sb.append("</a>");
            }
            else
                sb.append(s);
        }
        return sb.toString();
    }
Avatar billede arne_v Ekspert
26. august 2004 - 15:20 #8
split både på linieskift og mellemrum
returner skille tegnene
undlad at appende ekstra mellemrum
Avatar billede roo104 Nybegynder
26. august 2004 - 15:24 #9
Jeg får stadig ikke newlines med :(
og skal "\n " ikke være "\n" uden mellemrummer ?
Avatar billede arne_v Ekspert
26. august 2004 - 15:32 #10
Nej.

Og jeg får linie skift med.

Har du copy pastet min version ind ?
Avatar billede arne_v Ekspert
26. august 2004 - 15:32 #11
Program:

import java.util.*;

public class H {
    public static String encodeHtml(String tag) {
        StringTokenizer st = new StringTokenizer(tag, "\n ", true);
        StringBuffer sb = new StringBuffer();
        while(st.hasMoreTokens()) {
            String s = st.nextToken();
            if(s.toLowerCase().startsWith("http://")) {
                sb.append("<a href=\"");
                sb.append(s);
                sb.append("\">");
                sb.append(s);
                sb.append("</a>");
            }
            else if(s.toLowerCase().startsWith("www.")) {
                sb.append("<a href=\"http://");
                sb.append(s);
                sb.append("\">");
                sb.append(s);
                sb.append("</a>");
            }
            else
                sb.append(s);
        }
        return sb.toString();
    }
    public static void main(String[] args) {
        System.out.println(encodeHtml("a b http://www.dk c"));
        System.out.println(encodeHtml("a\nb\nhttp://www.dk\nc"));
    }
}

output:

a b <a href="http://www.dk">http://www.dk</a> c
a
b
<a href="http://www.dk">http://www.dk</a>
c
Avatar billede roo104 Nybegynder
26. august 2004 - 15:40 #12
det virker fint i consol, men når jeg henter teksten fra mysql db'en går det galt.
Det må være måden mysql gemmer newline. Teksten kommer oprindeligt fra et textarea, som bliver gemt i db uden nogen formatering.
Avatar billede roo104 Nybegynder
26. august 2004 - 15:42 #13
ahhh hov så skal \n laves til <br>
Avatar billede arne_v Ekspert
26. august 2004 - 15:42 #14
Kan jeg få dig til at prøve med:

StringTokenizer st = new StringTokenizer(tag, "\r\n ", true);
Avatar billede arne_v Ekspert
26. august 2004 - 15:43 #15
Hvis det skal vises som linie skift i HTML skal du bruge <br/> fordi
almindelige linie skift ignoreres i HTML formateringen.
Avatar billede roo104 Nybegynder
26. august 2004 - 15:44 #16
hehe havde lige prøvet med StringTokenizer st = new StringTokenizer(tag, "\r\n ", true);
Jeg skal nok bare have replacet newlines med <br> først
Avatar billede arne_v Ekspert
26. august 2004 - 15:45 #17
Det ville jeg nok gøre til sidst for at undgå problemer med tokenizeren.
Avatar billede arne_v Ekspert
26. august 2004 - 15:46 #18
return sb.toString().replaceAll("\n","<br/>");
Avatar billede roo104 Nybegynder
26. august 2004 - 15:51 #19
Sådan nu virker det:
public static String encodeHtml(String tag) {
        String t = encodeHtmlTag(tag);
        StringTokenizer st = new StringTokenizer(t, " ", true);
        StringBuffer sb = new StringBuffer();
        while(st.hasMoreTokens()) {
            String s = st.nextToken();
            if(s.toLowerCase().startsWith("http://")) {
                sb.append("<a href=\"");
                sb.append(s);
                sb.append("\">");
                sb.append(s);
                sb.append("</a>");
            }
            else if(s.toLowerCase().startsWith("www.")) {
                sb.append("<a href=\"http://");
                sb.append(s);
                sb.append("\">");
                sb.append(s);
                sb.append("</a>");
            }
            else
                sb.append(s);
        }
        return sb.toString();
    }

encodeHtmlTag(tag) replacer alle html tags også "\n" med "<br> "

Smid et svar Arne, det var en bøvlet omgang :)
Avatar billede arne_v Ekspert
26. august 2004 - 15:52 #20
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester