Avatar billede besoft Nybegynder
06. april 2010 - 17:53 Der er 5 kommentarer

Søg og erstat -agtigt problem

Hejsa

Jeg har en streng fra et lukket system, hvor jeg skal ændre lidt i teksten, inden den præsenteres.

Det er for så vidt ikke noget problem, men jeg skal gøre det rekursivt og er i tvivl om den bedste metode.

$streng = "Brug varenummer [vnr]1554-52-867[/vnr] sammen med varenummer [vnr]5548-63-559[/vnr] for at opnå bedste resultat";

I denne streng skal jeg finde alle strenge mellem "[vnr]" og "[/vnr]". Med den fundne streng, skal jeg lave lidt ændringer, opslag osv. Til sidst skal strenge erstattes med mit nye resultat og den originale streng skal opdateres.


I ovenstående eksempel skal outputtet fx være:

"Brug varenummer <a href='/prod/motor/1554-52-867'>1554-52-867</a> sammen med varenummer <a href='/prod/stempler/5548-63-559'>5548-63-559</a> for at opnå bedste resultat"


Eftersom der kan være alt fra nul til mange (20-40 stk) i hver streng, har jeg brug for en eller anden funktion der kan finde alle strenge mellem "[vnr]" og "[/vnr]".

Er det en rekursiv funktion, en simpel while() eller en regEx der skal på bordet?

Jeg er rimelig lost lige nu.
Avatar billede besoft Nybegynder
06. april 2010 - 17:55 #1
Det skal lige tilføjes, at jeg allerede har en funktion til at finde en streng mellem 2 andre.

function getStringBetween($string, $start, $end) {
        $string = " ".$string;
        $ini = strpos($string,$start);       
        if ($ini == 0) return "";
        $ini += strlen($start);
        $len = strpos($string,$end,$ini) - $ini;
        return substr($string,$ini,$len);
    }

Denne bruger jeg ofte, men har endnu ikke haft behovet i en rekursiv eller lign situation.
Avatar billede ksoren Nybegynder
06. april 2010 - 18:04 #2
regex er næsten oplagt til sådan noget ...

$streng = preg_replace('#\[vnr\](.*?)\[/vnr\]#i', '<a href="/prod/motor/$1">$1</a>', $streng);

Der er så ingen validering i denne på om nummeret har korrekt syntax.
Avatar billede ksoren Nybegynder
06. april 2010 - 18:06 #3
Ah, den er ikke dynamtisk nok kan jeg se
Avatar billede ksoren Nybegynder
06. april 2010 - 18:17 #4
function create_link($s){
    $vnr = $s[1];
    $vsplit = explode('-', $vnr);
    $url = "";

    // noget database noget
    switch($vsplit[0]){
        case "1554": $url = "/prod/motor/$vnr"; break;
        case "5548": $url = "/prod/stempler/$vnr"; break;
        default : $url = "/xx/$vnr"; break;
    }

    return "<a href=\"$url\">$vnr</a>";
}


$streng = preg_replace_callback('#\[vnr\](.*?)\[/vnr\]#i', 'create_link', $streng);
Avatar billede besoft Nybegynder
06. april 2010 - 23:10 #5
ksoren2, det var lige præcis hvad jeg skulle bruge.

Naturligvis lidt tilretning i switch'en, men det var jo også planen.

Tak for hjælpen. Smid et svar og inkassér ved kasse 1 :)
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