Avatar billede frisch Nybegynder
29. august 2005 - 22:57 Der er 12 kommentarer og
1 løsning

preg_replace problem

Jeg har en funktion, som omdanner en url til en klikbar url, som ser således ud:

function url2link($url,$chr_limit = 50,$add = '...')
{
  $url = preg_replace("!(http:/{2}[\w\.]{2,}[/\w\-\.\?\&\=\#]*)!e", "'<a href=\"\\1\" title=\"\\1\" target=\"_blank\">'.(strlen('\\1')>=$chr_limit ? substr('\\1',0,$chr_limit).'$add':'\\1').'</a>'", $url);
  return $url;
}

Den virker fint.

Derudover har jeg en anden funktion der skal omdanne http://www.url.dk til at vise et billede.

Hvis man kun anvender den ene funktion virker det, men hvis man bruger dem begge, laver url2link, den url der står mellem om til en klikbar url, og den kan derfor ikke vise billedet.

Derfor vil jeg gerne have lavet url2link sådan, at den kun skal lave url's om, som IKKE har et [img] foran sig. Hvordan griber jeg det an?
Avatar billede coderdk Praktikant
30. august 2005 - 00:34 #1
Hmm prøv at udvide dit pattern:

"!(http:/

til:

"![^\]](http:/
Avatar billede frisch Nybegynder
30. august 2005 - 01:31 #2
Det virker, tak for det :) ! Opret lige et svar for at få point :) !

Hvor kan man i øvrigt se alle de parametre som skal angives til diverse formål?
Avatar billede jakobdo Ekspert
30. august 2005 - 08:17 #3
http://www.regexbuddy.com/ kan varmt anbefales.
Og ellers skal du bare sætte dig ned og læse om RegExp.
Avatar billede frisch Nybegynder
30. august 2005 - 10:53 #5
Jeg var nok lidt for hurtig på aftrækkeren da jeg skrev at det virkede.

Nu bliver en url kun til et klikbart link, hvis man i samme textboks også har anvendt , ellers omdanner den det ikke.
Avatar billede coderdk Praktikant
30. august 2005 - 10:59 #6
Hmm det virker hos mig, men ikke hvis den STARTER med et link, det er fixet i denne:

    function url2link($url,$chr_limit = 50,$add = '...')
    {
        $url = preg_replace(
            "!(^|[^\]])(http:/{2}[\w\.]{2,}[/\w\-\.\?\&\=\#]*)!e"
            ,"'<a href=\"\\2\" title=\"\\2\" target=\"_blank\">' . ( strlen( '\\2' ) >= $chr_limit ? substr( '\\2', 0, $chr_limit ) . '$add' : '\\2' ) . '</a>'", $url);
        return $url;
    }
Avatar billede frisch Nybegynder
30. august 2005 - 11:28 #7
Ah ja, nu virker det også her. En sidste ting for at gøre det helt perfekt:

Jeg har også en funktion der omdanner url til et klikbart link, men der går url2link selvfølgelig ind og omdanner url'en først, og bagefter gør funktionen det også, hvilket bliver noget værre rod. Hvordan får jeg url2link til at ignorere url's der står i [url=] ?
Avatar billede coderdk Praktikant
30. august 2005 - 11:35 #8
ændr

"!(^|[^\]])(http:/{2}[\w\.]{2,}[/\w\-\.\?\&\=\#]*)!e"

til

"!(^|[^\]=])(http:/{2}[\w\.]{2,}[/\w\-\.\?\&\=\#]*)!e"
Avatar billede frisch Nybegynder
30. august 2005 - 11:54 #9
Hmm den er der ikke helt endnu. Hvis man skriver test bliver det, pga. url2link, til:

http://www.url.dk" target="_blank">test

funktionen ser således ud:

$data = preg_replace("/(\[url=(.*)\])(.*)(\[\/url\])/U","<a href=\"\\2\" target=\"_blank\">\\3</a> ", $data);
Avatar billede coderdk Praktikant
30. august 2005 - 12:09 #10
Nu har jeg samlet det i én, prøv og se om dette ikke virker:

    function url2link($url,$chr_limit = 50,$add = '...')
    {
        $reps = array(
                "!(^|[^\]=])(http:/{2}[\w\.]{2,}[/\w\-\.\?\&\=\#]*)!e" => "'<a href=\"\\2\" title=\"\\2\" target=\"_blank\">' . ( strlen( '\\2' ) >= $chr_limit ? substr( '\\2', 0, $chr_limit ) . '$add' : '\\2' ) . '</a> '"
                ,"/\[url=(.*?)\](.*?)\[\/url\]/" => "<a href=\"\\1\" target=\"_blank\">\\2</a> "
                ,"/\[img\](.*?)\[\/img\]/" => "<img src='\\1' alt=''> "
            );
        $url = preg_replace(
                array_keys( $reps )
                ,array_values( $reps )
                ,$url
            );
        return $url;
    }

Den laver både links, [url] og [img]
Avatar billede frisch Nybegynder
30. august 2005 - 14:04 #11
Virker ikke helt endnu, men det er tæt på.

Jeg skrev:

http://www.url.dk

test

http://www.url.dk/billede.jpg

Den gav følgende.

http://www.klein.adsl.dk/bf/Billede003.jpg (klikbart link)

http://www.klein.adsl.dk/bf/Billede003.jpg " target="_blank">test
(hvor selve urlen er klikbar, men resten: "target="_blank">test" står bagefter som almindelig tekst)

Og så indsatte den et billede som ønsket. Der er altså stadig problemer med [url].
Avatar billede coderdk Praktikant
30. august 2005 - 14:07 #12
Med denne test:

<?php

    $url = "http://www.url.dk

test

http://www.url.dk/billede.jpg";

    function url2link($url,$chr_limit = 50,$add = '...')
    {
        $reps = array(
                "!(^|[^\]=])(http:/{2}[\w\.]{2,}[/\w\-\.\?\&\=\#]*)!e" => "'<a href=\"\\2\" title=\"\\2\" target=\"_blank\">' . ( strlen( '\\2' ) >= $chr_limit ? substr( '\\2', 0, $chr_limit ) . '$add' : '\\2' ) . '</a> '"
                ,"/\[url=(.*?)\](.*?)\[\/url\]/" => "<a href=\"\\1\" target=\"_blank\">\\2</a> "
                ,"/\[img\](.*?)\[\/img\]/" => "<img src='\\1' alt=''> "
            );
        $url = preg_replace(
                array_keys( $reps )
                ,array_values( $reps )
                ,$url
            );
        return $url;
    }

    echo url2link( $url );
   
?>

Får jeg:

<a href="http://www.url.dk" title="http://www.url.dk" target="_blank">http://www.url.dk</a>

<a href="http://www.url.dk" target="_blank">test</a>

<img src='http://www.url.dk/billede.jpg' alt=''>

... og det ser da rigtigt ud?
Avatar billede frisch Nybegynder
30. august 2005 - 14:17 #13
Det har du ret i, jeg havde lige overset en dubleant af funktionen.

Typisk sjuskefejl.

Det virker perfekt nu! Tusind tak for hjælpen!
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