Avatar billede flim Nybegynder
01. september 2005 - 11:12 Der er 20 kommentarer og
1 løsning

Hvordan vises billeder?

Jeg har følgende script, som rent faktisk virker som det skal:

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

Der er bare et lille 'men'...

Jeg har et lille forum på min hjemmeside, og før i tiden kunne folk vise billeder i selve forummet ved at skrive [p]http://sti_til_billede[/p]

Det kan de ikke mere, da den jo laver det om til et link, og der går kuk og kage i <img src=....> osv osv.

Jeg ville høre om der var en der kunne ændre i ovenstående script så den evt kan gå 3 tegn tilbage og checke om der står [p], og på den måde igen få det til at virke så jeg kan vise billeder ved at mine brugere skriver [p]...[/p]

Mvh Flim
Avatar billede coderdk Praktikant
01. september 2005 - 13:57 #1
Det er jo mig der har lavet den der :)
Prøv at ændre:

  $protodomain = "/$proto(($username(:$password)?@)?$url)/i";

til:

  $protodomain = "/(^|[^\]])$proto(($username(:$password)?@)?$url)/i";

og tilsvarnde ret:

  $protodomain => "<a href=\"\\0\" target=\"_blank\">\\2</a>"

til

  $protodomain => "<a href=\"\\0\" target=\"_blank\">\\3</a>"
Avatar billede coderdk Praktikant
01. september 2005 - 13:57 #2
(den sidste er den i $replacements)
Avatar billede flim Nybegynder
07. september 2005 - 15:47 #3
coderdk - kan du ikke sige hvorfor det ville hjælpe?

Går du ind og tester 3 tegn tilbage om det er et [ eller hvordan er det egentlig du tester om det skal laves til et billede eller et link?
Avatar billede coderdk Praktikant
07. september 2005 - 15:51 #4
Nope, jeg siger med denne: (^|[^\]]) at det er en match hvis den enten starter på en ny linje, eller tegnet før ikke er et ]-tegn :)
Avatar billede flim Nybegynder
14. december 2005 - 15:09 #5
Så kom jeg tilbage igen.

Kan så lige fortælle at det ikke virker, men at den stadig skriver <img src=" < a href =".... osv
Avatar billede flim Nybegynder
14. december 2005 - 15:17 #6
Dvs at mit script nu ser sådan her ud:

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\">\\3</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 );
    }
Avatar billede flim Nybegynder
14. december 2005 - 20:20 #7
Stadig ingen der kan hjælpe her?
Avatar billede coderdk Praktikant
14. december 2005 - 23:21 #8
Altså for mig at se virker det:

    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\">\\3</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 );
    }

    // Erstatter ikke
    $test = "hehhe [p]http://test.dk/test.jpg[/p]";
    echo htmlspecialchars(url2link($test));

    // Erstatter
    $test = "hehhe http://test.dk/test.jpg";
    echo htmlspecialchars(url2link($test));

Den første ignorerer den, fordi der er et ] foran, den anden laver den om til <a> osv... Så jeg ved ikke hvorfor det ikke skulle virke for dig.
Avatar billede flim Nybegynder
15. december 2005 - 08:16 #9
Det er altså lidt underligt.

Hvis jeg skriver en sti til et billede med[p]sti[/p] men UDEN http:// så får jeg følgende:

<img src="www.boysne.dk/billeder/lock.jpg" BORDER="0" ALIGN="bottom" ALT="">

(men billede bliver ikke vist, kun et rødt kryds, da den jo mangler http://)

Hvis jeg skriver linket med http:// så får jeg dette:

<img src=<a href=""http://boysne.dk/billeder/lock.jpg" target="_blank">boysne.dk/billeder/lock.jpg</a>" BORDER="0" ALIGN="bottom" ALT="">

Hvor går jeg galt i byen. Begge gange er det skrevet med [p]sti[/p], og jeg har lige kopieret det ind du har skrevet ovenfor...
Avatar billede flim Nybegynder
15. december 2005 - 08:43 #10
Ok, har måske fundet fejlen:


I min kode skriver jeg følgende for at få vist mit billede:

$beskrivelse = str_replace("[p]", "<img src=\"", $beskrivelse);
$beskrivelse = str_replace('[/p]', '" BORDER="0" ALIGN="bottom" ALT="">', $beskrivelse);

Men hvis jeg bare skifter [p] ud med <img src osv, så er det jo klart at linket stadig bliver vist ikk'?

Men hvordan gør jeg så så billedet bliver vist når der rent faktisk er et billede?
Avatar billede flim Nybegynder
15. december 2005 - 08:49 #11
Sidste besked før du får lov til at svare:

Den skriver det sådan set fint nok ud hvis ikke jeg bruger str_replace, så skriver den nemlig [p]http://blabla.jpg[/p] UDEN at lave det om til et link - se det er jo bare fint.

Hvordan laver jeg så det bliver lavet om til et billede?

Desuden.. nu går der kuk i almindelige links hvis jeg starter dem med http:// først. Hvis jeg undlader det og bare skriver www virker linket fint.

Håber du kan overskue alt dette jeg har skrevet. Håber stadig du har tid til at hjælpe. Må evt smide lidt flere point på højkant hvis det er :-)
Avatar billede coderdk Praktikant
15. december 2005 - 15:57 #12
Jeg er ikke helt med på hvad du mener. Hvordan går der kuk i alm. links?
"http://blabla.jpg" vil jo heller ikke matche noget i funktionen, den skal have formen "http://site.dk/path/file.jpg"...

Du kan også lave funktionen lidt om:

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\">\\3</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>"
                ,"/\[p\](.*?)\[\/p\]/i" => "<img src=\"\\1\" alt=\"\" border=\"0\" align=\"bottom\">"
            );
        return preg_replace( array_keys( $replacements ), array_values( $replacements ), $txt );
    }

Så vil den automatisk lave det om der står mellem [p][/p] til billeder...
Avatar billede flim Nybegynder
15. december 2005 - 16:07 #13
Jeg kigger lige på det og vender tilbage snart :-)
Avatar billede flim Nybegynder
15. december 2005 - 16:09 #14
JAAAAAAAAAAAAAAAAAAAAAAAAAAAA...

Sådan der sgu da!

Hvorfor sagde du ikke bare det til at starte med :P

Men mange tak for hjælpen - nu ser det ud til at virke.

Hvis der skulle komme problemer senere, så opretter jeg et nyt spørgsmål :-)
Avatar billede flim Nybegynder
15. december 2005 - 16:24 #15
Jeg har en sidste ting (ved ikke om jeg skal lave et nyt spørgsmål - bestemmer du)

Men dit script går i kage hvis man har et link med underscore.

Fx: http://domæne.dk/mit_navn.htm

Din stopper med at lave link ved underscore. Kan du flette det ind et sted?
Avatar billede coderdk Praktikant
15. december 2005 - 19:39 #16
$path = "\/[a-z0-9\/\-\.\(\)\%]*";

skal nok ændres til:

$path = "\/[a-z0-9\/\-\.\(\)\%_æøåÆØÅ]*";
Avatar billede flim Nybegynder
16. december 2005 - 08:55 #17
Ak ak - det vil bare ikke virke...

Skulle lige teste med et alm. link, og det kommer nu til at se sådan her ud:

<a href="<br />
http://<a href="http://www.boysne.dk/upload/2/snowman.jpg" target="_blank">www.boysne.dk/upload/2/snowman.jpg</a>" target="_blank"><a href="http://www.boysne.dk/upload/2/snowman.jpg" target="_blank">www.boysne.dk/upload/2/snowman.jpg</a></a><br />

Dette er hvad der kommer til at stå i koden når jeg skriver et ganske almindeligt link ind :/
Avatar billede flim Nybegynder
16. december 2005 - 08:58 #18
Skal lige siges at det er ikke den allersidste ændring der har medført dette. Mens du har rettet i den har jeg kun testet billeder, men du har åbenbart rettet i et eller andet så ganske almindelig links(som virkede før) ikke virker nu her.

Jeg smider lige 50 p. mere på højkant som du får i et andet spørgsmål hvis du kan fikse det så det hele bare virker :-)
Avatar billede coderdk Praktikant
16. december 2005 - 09:39 #19
Hmm, altså dette ser ud til at virke for mig:

    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\">\\3</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>"
                ,"/\[p\](.*?)\[\/p\]/i" => "<img src=\"\\1\" alt=\"\" border=\"0\" align=\"bottom\">"
            );
        return preg_replace( array_keys( $replacements ), array_values( $replacements ), $txt );
    }

    $test = "hehhe www.example.dk hehehe
        www.example.dk/hehee/ja.php ddd
        http://google.com/ yeah
        [p]http://test.dk/test.jpg[/p]";
    echo htmlspecialchars(url2link($test));

Det sidste er min "test case" :)
Avatar billede flim Nybegynder
16. december 2005 - 10:09 #20
Ja, kan godt se at det virker ved dig, men af en eller anden underlig grund så virker det ikke her.

Kan nu fortælle at billederne virker fint nu her, men almindelige links bliver bare vist som klar tekst. Dvs ikke som link.

Men det må vel være min egen kode der fucker det op siden det virker ved dig.

Kan bare ikke se hvad, for hvis jeg sætter den kode ind øverst på denne side (den oprindelige) så virker alle links (dog ikke billeder), så ved sgu ikke lige hvad du har rettet siden den :/
Avatar billede flim Nybegynder
16. december 2005 - 10:33 #21
Uden at have en dyt forstand på det, så fik jeg det rettet til så det også virker ved mig.

Den endelige funktion jeg brugte var:

    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\">\\3</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>"
                ,"/\[p\](.*?)\[\/p\]/i" => "<img src=\"\\1\" alt=\"\" border=\"0\" align=\"bottom\">"
            );
        return preg_replace( array_keys( $replacements ), array_values( $replacements ), $txt );
    }

Jeg smider lige 50 point til dig i et nyt spørgsmål som tak for hjælpen

www.exp.dk/spm/672635
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