Toon posts:

[php] template probs

Pagina: 1
Acties:

Verwijderd

Topicstarter
Mensen,

Ik heb de volgende klasse gemaakt:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class document
{

    var $data,$template;

    function set_tpl($file)
    {
        $this->template=$file;
    }

    function insert($key,$value)
    {
        $this->data[$key]=$value;
    }


    function parse()
    {

        $fp=fopen($this->template,"r") or die("Kan template niet openen");
        while(! feof($fp))
        {
            $line=fgets($fp,1024);
            
            if(strstr($line,"{_"))
            {
                $line = preg_replace("/{_(.*?)_}/",$this->data["\\1"],$line);

            }
        echo $line;
        }
        

    }

}


Hierbij gebruik ik de volgende code

PHP:
1
2
3
4
$page=new document();
$page->set_tpl("parse.tpl");
$page->insert("INHOUD","yep");
$page->parse();


De waarde bij insert() zet hij in een array, dit werkt. De preg_replace moet de {_CODE_} uit de /tpl vissen en vervangen door de value van die array.

het probleem:
Maar de volgende regel geeft niets terug:
PHP:
1
$line = preg_replace("/{_(.*?)_}/",$this->data["\\1"],$line);


terwijl deze regel het wel doet:
PHP:
1
$line = preg_replace("/{_(.*?)_}/",$this->data["INHOUD"],$line);


en als ik de volgende regel gebruik:

PHP:
1
$line = preg_replace("/{_(.*?)_}/","\\1",$line);


Dan print het wel...

Wie kan me helpen, ik kom er zelf niet meer uit.,

  • tomato
  • Registratie: November 1999
  • Niet online
Kijk eens naar de /e modifier.

(Gebruik overigens liever $1 dan \1)

Verwijderd

code:
1
$line = preg_replace("/{_(.*?)_}/e", '$this->data["$1"]', $line);

Verwijderd

Topicstarter
If this modifier is set, preg_replace() does normal substitution of backreferences in the replacement string, evaluates it as PHP code, and uses the result for replacing the search string.
[C] dat was het idd, mmm kleine dingen waar je dan maar niet achter komt.
Dus dat is opgelost.

Wat vinden jullie verder van de aanpak?

Verwijderd

Ik zou zelf de file al openen bij het aanroepen van de 'set_tpl' functie. Waarom? Omdat wanneer je dan een template gaat parsen in een loopje de file niet elke keer opnieuw wordt geopend.

Verwijderd

Topicstarter
maar deze regel zit toch niet in de while loop:

$fp=fopen($this->template,"r") or die("Kan template niet openen");

Verwijderd

Nee maar wanneer je één template meerdere malen gaat parsen (bijvoorbeeld posts in een forum) dan wordt die template elke keer opnieuw geopend. Snap je?

Verwijderd

Topicstarter
Ah, ok.

Ik zat meer op document niveau te denken. Dan zal ik daar eens naar kijken.

Is het niet verstandiger om eerst met strstr() te kijken of de tags in de regel zitten? ivm de snelheid:

PHP:
1
2
3
4
5
6
7
8
9
10
11
        while(! feof($fp))
        {
            $line=fgets($fp,1024);
            
            if(strstr($line,"{_"))
            {
                $line = preg_replace("/{_(.*?)_}/e", '$this->data["$1"]', $line);

            }
        echo $line;
        }

Verwijderd

Zover ik weet zijn regular expressions de snelste manier om dit soort dingen te doen ( regular expressions maken gebruik van pattern matching en preg is perl style regular expression ). Ongetwijfelt gebruikt strstr() intern ook een regex, de extra check lijkt mij om deze reden niet sneller. Misschien bij grote expressies maar daar zou je dan eens een test op moeten loslaten. Voor dit soort simpele dingen strstr() weghalen.
Pagina: 1