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.
Annonceindlæg fra HP
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.
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.
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!
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); }
Vi tilbyder markedets bedste kurser inden for webudvikling