Próbuję napisać własny system szablonów. Właściwie to go napisałem, ale niestety chodzi on zdecydowanie za wolno, więc próbuję go napisać od nowa

Mam pytanie odnośnie parsowania szablonu.
Załóżmy że mamy taki plik test.tpl
Kod
<!-- BEGIN nazwa_sekcji -->
Stała: {JAKAS_STALA}<br>
Sekcja językowa: {L_User}<br>
Przesłane ze skryptu: {V_TEST_VALUE}<br>
<!-- END nazwa_sekcji -->
Stała: {JAKAS_STALA}<br>
Sekcja językowa: {L_User}<br>
Przesłane ze skryptu: {V_TEST_VALUE}<br>
<!-- END nazwa_sekcji -->
I teraz w kodzie php:
[php:1:c76ea6911f]<?
$Tpl = new Tpl();
// ustawiamy aktualny szalbon na test.tpl
$Tpl -> set ("test");
// dodajemy do szablonu jakas wartosc
$Tpl -> add ("TEST_VALUE", "wartosc");
// ustalamy stałą
define ('JAKAS_STALA', "wartosc_stalej");
// i jeszcze wartosc z jakiejs tablicy
$lang = array();
$lang['User'] = "Użytkownik";
// pokazujemy zparsowany szablon
print $Tpl -> get ("nazwa_sekcji");
?>[/php:1:c76ea6911f]
I tutaj moje pytanie: jak napisać metodę klasy Tpl, żeby sprawdzała 3 różne typy zmiennych: stałe, przesłane ze skryptu oraz indeksy tablicy... Czyli żeby zamieniała:
{L_Index} na $lang['Index']
{CONST} na constant("CONST")
{V_ZMIENNA} na $this->data["ZMIENNA"] (czyli przeslana ze skryptu)
Ten kod działa, ale bardzo wolno się wykonuje... Może jakieś sugestie?
[php:1:c76ea6911f]<?
/*
pominalem tutaj definicje klasy itd., to jest metoda parse()
*/
function parse($section, $txt)
{
// wylapujemy sekcje z pliku
//
$pattern = "#<!-- BEGIN ".$section." -->(.*?)<!-- END ".$section." -->#s";
preg_match_all ($pattern, $txt, $_arr);
$txt = $_arr[1][0];
// teraz wylapujemy wszystko w nawiasach klamrowych {jakis_tekst}
//
preg_match_all ("/{(.*?)}/si", $txt, $words);
$patterns = array ();
$replacements = array ();
foreach ($words[1] as $key => $value)
{
$word = $words[1][$key];
$start = substr ($word, 0, 2);
$patterns [] = "{$word}";
if ($start == "L_")
{
$word = $lang [substr ($word, 2)];
}
elseif ($start == "C_")
{
$word = $c_lang [substr ($word, 2)];
}
elseif ($start == "V_")
{
$word = $this -> V_[substr ($word, 2)];
}
else
{
if (defined ($word)) $word = constant ($word);
else $word = "";
}
$replacements [] = $word;
}
$i = count ($patterns);
while ($i--)
$txt = ereg_replace ($patterns[$i], $replacements[$i], $txt);
return $txt;
}
?>[/php:1:c76ea6911f]
Naprawde sie troche z tym mecze i bede wdzieczny za wszelkie podpowiedzi... Jak to da sie zrobic prościej?
pozdrawiam
Denver