Avatar billede rathkjen Nybegynder
27. marts 2008 - 13:17 Der er 20 kommentarer og
1 løsning

Problem med url2link

Jeg har fundet dette script her på siden:

function url2link($txt)
{
        $username = "[a-z0-9_\-]+";
        $password = "[a-z0-9_\-!#]+";
        $host = "[a-z0-9\-]+\.[a-z0-9\-\.]+";
        $port = "\d{1,5}";
        $path = "\/[a-z0-9\/\-_\.\(\)\%#]*";
        $querystr = "\?[a-z0-9&=\-_\.%\(\)#]+";
        $proto = "(https?|ftp):\/\/";
        $url = "$host(:$port)?($path($querystr)?)?";
        $protodomain = "/$proto(($username(:$password)?@)?$url)/i";
        $domain = "/(^| )(www\.$url)/im";
        $protomail = "/mailto:($username@$host)/i";
        $mail = "/(^| )($username@$host)/im";
        $replacements = array(
                $protodomain => "<a href=\"\\0\" target=\"_blank\">\\2</a>"
                ,$domain => "\\1<a href=\"http://\\2\" target=\"_blank\">\\2</a>"
                ,$protomail => "<a href=\"\\0\">\\1</a>"
                ,$mail => "\\1<a href=\"mailto:\\2\">\\2</a>"
            );
        return preg_replace( array_keys( $replacements ), array_values( $replacements ), $txt );
}

Det virker også efter hensigten, dog med et enkelt problem.

Hvis et link ser sådan her ud:

www.test.dk/index.php?Page=Nisse&Hej=123

Laver den det om til

<a>www.test.dk/index.php?Page=Nisse&</a>;Hej=123

Bemærk at den også sætter et ';' ind.

Så hvis der er en der har en idé til hvordan jeg får den til at lave det hele tid et link ville det være nice :)
Avatar billede nielle Nybegynder
27. marts 2008 - 18:54 #1
Der er absolut ingenting i den vise kode som kan hav indsat det ;-tegn. Det må altså på en eller anden måde være sneget ind i input på en eller anden anden måde.

Prøv at lave en test hvor at du idskriber resultatet før og efter kaldet til url2link(). Prøv så at lave en Vis Kilde på resultatet - sådan at vi kan være sikre på at der står '&' og ikke f.eks. "&amp;" i dine data.
Avatar billede rathkjen Nybegynder
27. marts 2008 - 19:08 #2
Du har ret, har fundet en del af fejlen.

url2link(nl2br(htmlspecialchars($row['besked'])))

Sådan gør jeg, men fjerner jeg htmlspecialchars() så skriver den linket rigtigt. Kan jeg gøre det på en anden måde?
Avatar billede nielle Nybegynder
27. marts 2008 - 19:16 #3
Tja, deu kan jo lade være med at kalde htmlspecialchars().

Men hvis du ikek vil det, så kan du feksl lave en replace somændre &amp; tilbage til & - inden at du sender resultatet igennem url2link().
Avatar billede coderdk Praktikant
27. marts 2008 - 20:59 #4
Hmm prøv lige at lave

$querystr = "\?[a-z0-9&=\-_\.%\(\)#]+";

om til

$querystr = "\?[a-z0-9&=\-_\.%\(\)#;:\[\]\/]+";
Avatar billede nielle Nybegynder
27. marts 2008 - 21:03 #5
coderdk > Du behøver altså ikke at escape alle de specialtegn når de er i en [...]

:^)
Avatar billede coderdk Praktikant
27. marts 2008 - 21:11 #6
nielle, Du har nok ret, den kan vel måske nok se sådan ud:

$querystr = "\?[a-z0-9&=\-_.%\(\)#;:[\]/]+";

men jeg gider ikke teste, og det virker jo med escapes :-D
Avatar billede rathkjen Nybegynder
27. marts 2008 - 21:26 #7
Det hjalp!

coderdk:
"Hmm prøv lige at lave
$querystr = "\?[a-z0-9&=\-_\.%\(\)#]+";
om til
$querystr = "\?[a-z0-9&=\-_\.%\(\)#;:\[\]\/]+";"

Tak for hjælpen!

Vil du ha point? så smid svar.
Avatar billede coderdk Praktikant
27. marts 2008 - 21:29 #8
:-)

Faktisk burde det nok virke med:

$querystr = "\?[a-z0-9&=_.%()#;:[\]/-]+";
Avatar billede nielle Nybegynder
27. marts 2008 - 22:30 #9
$querystr = "\?[][a-z0-9&=_.%()#;:/-]+";
Avatar billede nielle Nybegynder
27. marts 2008 - 22:31 #10
Jeg synes nu at det er en pænere læsning at erstatte &amp; med & før at du putter den igennem url2link() - Med den løsning er der ingen grund til at tilfæje tegnet ';' som værende et lovligt tegn i et url.
Avatar billede rathkjen Nybegynder
27. marts 2008 - 22:40 #11
$querystr = "\?[a-z0-9&=\-_\.%\(\)#;:\[\]\/]+";"
$querystr = "\?[a-z0-9&=_.%()#;:[\]/-]+";


Er der den store forskel? :D
Avatar billede coderdk Praktikant
27. marts 2008 - 22:49 #12
nielle, ; er skam et lovligt tegn i en querystring - flere sites bruger ; i stedet for & - så den burde faktisk have været der :)

rathkjen, Der er ingen forskel funktionalitetsmæssigt - den er lidt kortere den nye, men fungerer på samme måde - nogle overflødige escapes \ er taget væk og - er flyttet :)
Avatar billede coderdk Praktikant
27. marts 2008 - 22:50 #13
komma manglede også, der er sikkert mange flere der mangler ;P

$querystr = "\?[a-z0-9&=_.,%()#;:[\]/-]+";
Avatar billede rathkjen Nybegynder
27. marts 2008 - 23:25 #14
Okay, tak for hjælpen alle.
Avatar billede rathkjen Nybegynder
27. marts 2008 - 23:30 #15
Faktisk virker
$querystr = "\?[a-z0-9&=_.,%()#;:[\]/-]+";
og
$querystr = "\?[a-z0-9&=_.%()#;:[\]/-]+";
ikke. :)

Men den her virker
$querystr = "\?[a-z0-9&=\-_\.%\(\)#;:\[\]\/]+";
Avatar billede coderdk Praktikant
28. marts 2008 - 01:07 #16
My bad :) Den skulle have set sådan ud:

$querystr = "\?[a-z0-9&=_.%()#;:[\]\/-]+";
Avatar billede nielle Nybegynder
28. marts 2008 - 06:49 #17
$querystr = "\?[][a-z0-9&=_.%()#;:/-]+";
Avatar billede rathkjen Nybegynder
28. marts 2008 - 09:40 #18
Hehe okay, tak for hjælpen begge, nogen der føler sig snydt ang. point? så finder vi ud af det :)
Avatar billede nielle Nybegynder
29. marts 2008 - 08:41 #19
Nej da :^)
Avatar billede rathkjen Nybegynder
30. marts 2008 - 00:14 #20
Okay, du siger til hvis du skal ha' nogen.
Avatar billede nielle Nybegynder
30. marts 2008 - 09:43 #21
Nej tak, men i øvrigt tak for tilbuddet. :^)
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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