Avatar billede gedekid Nybegynder
22. marts 2011 - 14:40 Der er 3 kommentarer og
1 løsning

preg_match og preg_replace problem

Hej eksperter,

jeg sidder og forsøger med noget html template halløj, men der er noget jeg ikke helt kan få til at fungere.

Min funktion løber igennem en html fil og læser hvilke markers der er deri og skal så erstatte dem med noget data... Det kører sådan set ok, men den printer også selve markeren ..

Jeg bruger denne til at hente markers

function GetMarkers($markers = array()) {
       
        foreach($markers as $key => $value) {
            $this->markers["###". strtoupper($key) ."###"] = $value;
        }
       
        return $this->markers;
    }

og det er så meningen at denne skal erstatte mine markers med noget tilhørende data

function TemplateGenerator($template) {
           
        $data = file_get_contents($template);
               
        foreach($this->markers as $key => $value) {
            if(preg_match("/". preg_quote($key) ."/", $data, $matches)) {
                echo preg_replace("/". preg_quote($key) ."/", $value, $data);       
            }
        }
           
        return;
    }

men det giver mig et resultat der ser sådan ud

RT 801
###TITEL###
###FORBRUG###
###LAEGTEAFSTAND###
###RTNAVN###
Rød Højslev vingetegl Normalformat
###FORBRUG###
###LAEGTEAFSTAND###
###RTNAVN###
###TITEL###
12.2
###LAEGTEAFSTAND###
###RTNAVN###
###TITEL###
###FORBRUG###
0.375

hvilket jo ikke er helt efter planen ....

En der kan gennemskue hvad jeg fu**** op?

På forhånd tak.
Avatar billede intenz Novice
22. marts 2011 - 15:29 #1
Det er rent gæt, da man ikke kan se værden af dine 'markers', kun variablerne som ikke fortæller noget.

Men det ser ud til, at du mangler en strtoupper() når du forsøger at lave replace.

Er det desuden bevidst, at du bruger preg_replace? En så simpel søg/erstat funktion ville køre hurtigere med en str_replace.
Avatar billede nielle Nybegynder
22. marts 2011 - 21:28 #2
Din løkke i TemplateGenerator() gennemløber arrayet med markers.

For hvert gennemløb udskriver den det hele, men med den aktuelle marker udskiftet:


RT 801 (###RTNAVN### udskiftet)
###TITEL###
###FORBRUG###
###LAEGTEAFSTAND###

...

###RTNAVN###
Rød Højslev vingetegl Normalformat (###TITEL### udskiftet)
###FORBRUG###
###LAEGTEAFSTAND###

...

###RTNAVN###
###TITEL###
12.2 (osv...)
###LAEGTEAFSTAND###

...

###RTNAVN###
###TITEL###
###FORBRUG###
0.375 (osv...)


Du skal selvfølgeligt gemme det replacede resultat tilbage i $data i stedet for.

Og, nej der er vist ingen grund til at bruge regex her.
Avatar billede gedekid Nybegynder
23. marts 2011 - 08:53 #3
Jeg takker mange gange for begge svar, men nielles løsning løste mit problem Så vil du lige smide et svar!

Når jeg laver det på nedenstående måde så får jeg det ønskede resultat:

function TemplateGenerator($template) {
           
        $data = file_get_contents($template);
               
        foreach($this->markers as $key => $value) {
            if(preg_match("/". preg_quote($key) ."/", $data, $matches)) {
                $data = str_replace($key, $value, $data);
            }
        }
               
        return $data;
    }

Der var egentlig ikke nogen grund til at jeg brugte preg_replace andet end det var hvad jeg havde googlet mig frem til.
Men str_replace fungerer upåklageligt!
Avatar billede intenz Novice
23. marts 2011 - 13:32 #4
Ja, jeg kan godt se jeg havde misforstået dit spørgsmål :)

Du kan gøre det mere effektivt ved også at droppe dine preg_match, og bruge strpos() i stedet.

if(strpos($data, $key) !== false) {
  $data = str_replace($key, $value, $data);
}
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