Avatar billede supermand69 Nybegynder
01. november 2004 - 16:22 Der er 20 kommentarer og
1 løsning

preg_replace i funktion

Jeg har en funktion som skal lave url's om til links, men den virker ikke helt som den skal

Se her: http://clark.avansis.dk/test/url2link.php

I den øverste linje tager den et mellemrum med i mit link, og i min ftp adresse laver den en mailto :(

Kan det ikke lade sig gøre at lægge de to sidste variabler i mit array sammen til en? Altså de to som laver url's om til links...

NB. Jeg vil ikke bruge tagster!
Avatar billede coderdk Praktikant
01. november 2004 - 19:25 #1
Din:

function url2link($txt)
{
    $domain_match = "[a-z0-9@:\-\.]+";
    $url_match = $domain_match."(\/[a-z0-9_\-\.\/]+)?(\?[a-z0-9=&%]+)?";
   
    $trans_arr = array(
        "/[a-z0-9_\-\.]+@$domain_match/i" => "<a href='mailto:\\0'>\\0</a>",
        "/(ftp|https?):\/\/$url_match/i" => "<a href='\\0' target='_blank'>\\0</a>",
        "/(^| )(www\.$url_match)/im" => "\\1<a href='http://\\2' target='_blank'>\\2</a>"
    );
   
    return preg_replace(array_keys($trans_arr), array_values($trans_arr), $txt);
}

Det var lang tid siden jeg havde lavet noget ligende, og jeg kunne ikke lige finde det jeg havde lavet før, så her er en ny:

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=\"http://\\2\">\\2</a>"
        );
    return preg_replace( array_keys( $replacements ), array_values( $replacements ), $txt );
}

Ved godt at min er lidt større, ved ikke lige hvad der skete ;)

Bemærk at http://example.dk?var=1 ikke er en gyldig URL!
Avatar billede coderdk Praktikant
01. november 2004 - 19:27 #2
Bare fordi nogle browsere godt kan følge linket, som den selv laver om til http://example.dk/?var=1, betyder ikke at det er rigtigt ;)
Avatar billede supermand69 Nybegynder
01. november 2004 - 19:59 #3
den kan stadig ikke lave http://example.dk/?var=1

hehe...
Avatar billede supermand69 Nybegynder
01. november 2004 - 20:02 #4
hvad gør de her:
(^| )
/im
Avatar billede coderdk Praktikant
01. november 2004 - 20:18 #5
Hvis du bruger min og ændrer:

    $path = "\/[a-z0-9\/\-\.\(\)\%]+";

til

    $path = "\/[a-z0-9\/\-\.\(\)\%]*";

Så virker dén ;)
Avatar billede coderdk Praktikant
01. november 2004 - 20:19 #6
(^| ) <- skal enten starte med på en ny linie, eller være et mellemrum - derfor der er /im i slutningen i stedet for bare /i (m er multiline)
Avatar billede coderdk Praktikant
01. november 2004 - 20:20 #7
og hvis du bruger din:

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

ændres til:

    $url_match = $domain_match."(\/[a-z0-9_\-\.\/]*)?(\?[a-z0-9=&%]+)?";

Så burde den også virke
Avatar billede coderdk Praktikant
01. november 2004 - 20:21 #8
D'oh i min skal:

            ,$mail => "\\1<a href=\"http://\\2\">\\2</a>"

naturligvis ændres til:

            ,$mail => "\\1<a href=\"mailto:\\2\">\\2</a>"
Avatar billede supermand69 Nybegynder
01. november 2004 - 20:23 #9
mange tak for hjælpen :)

jeg bruger dit forslag... hehe.. men du har lige en fejl sidst i dit array med $mail.. der skal vel stå mailto: i stedet for http:// :p
Avatar billede supermand69 Nybegynder
01. november 2004 - 20:23 #10
hehehehehe....
Avatar billede supermand69 Nybegynder
08. november 2004 - 09:25 #11
hey igen... er lige stødt på et problem :( hvis der er <br> <br /> ser den det ikke som et linjeskift eller mellemrum
Avatar billede coderdk Praktikant
08. november 2004 - 10:52 #12
Jeg er ikke helt med, kan du komme med et eksempel?
Avatar billede supermand69 Nybegynder
08. november 2004 - 11:14 #13
hov min fejl... det var slet ikke der fejlen var, men i wordwrap. håber du lige gider se på det alligevel :)

den ser ikke linjeskift som mellemrum!

http://clark.avansis.dk/test/test.php
Avatar billede coderdk Praktikant
08. november 2004 - 11:52 #14
Jeg tror du skal bruge: wordwrap( $html, $wordwrap, ' ', 1 );

Tag et kig på http://dk2.php.net/wordwrap :)
Avatar billede morteeart Nybegynder
08. november 2004 - 11:55 #15
btw. så findes der faktisk et url til <a href="">..  på http://dk2.php.net/manual/en/function.ereg-replace.php
Avatar billede coderdk Praktikant
08. november 2004 - 11:56 #16
morteeart, hvad mener du?
Avatar billede supermand69 Nybegynder
08. november 2004 - 12:02 #17
coderdk > er det ikke også det jeg gør? :)

den sidste skal vel bare være true?
Avatar billede coderdk Praktikant
08. november 2004 - 12:49 #18
Den sidste skal være 1 ;)
Avatar billede supermand69 Nybegynder
08. november 2004 - 12:55 #19
jamen den ser jo nok ellers ud til at virke... den breaker fint hvor den skal :)

eneste problem er at den tror at sidste ord i en linje og det første i næste linje også er et langt ord :(
Avatar billede coderdk Praktikant
08. november 2004 - 13:06 #20
Tænker du på linier som:

https://hha.dk<br>mailto:email@test.dk ?

For det er jo én linie, den tager ikke <br> som et linieskift, så er du nødt til at erstatte <br> med \n...
Avatar billede supermand69 Nybegynder
08. november 2004 - 13:14 #21
jamen den gør det jo også ved txt? og der er der jo ingen <br>
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