Originariamente inviato da flash.tato
Codice PHP:
function tpl_func_FUNZIONE($params, &$tpl)
{
if(isset($params['text']))
return $params['text'];
else
return "No text is present";
}
Per il parsing adesso uso le espressioni regolari e questa strada non mi convince del tutto, infatti sto pensando di scrivere un parser fatto in casa fatto apposta per analizzare la sinstassi del mio template engine.
Questa strada ti può dare tutta la flessibilità che ti serve, in questo modo mi sono implementato IF, LOAD, FOR scrivendo rispettivamente 3 funzioni.

E in più è facilmente personalizzabile per ogni tipo di script.
Questa è la strada che ti suggerisco, poi può darsi che un giorno pubblicherò il mio template engine, quando sarà serio si intende

con un proprio parser e capace di compilare in codice PHP.
Ciao,
mi sto scontrando anche io con il parsing del meta linguaggio del template.
Al momento sto usando le RegExp, ma mi chiedo quale sia la strada migliore per evitare di fare degli IF ELSE a catena.
Esempio: la sintassi possibile è books[1] oppure book.getTitle()
Il modello per individuare correttamente i pattern della sintassi sarà:
$pattern = "/^([\w_]+)((\.([\w_]+)\(\))|(\[([0-9]+)\]))/s";
Ora, in caso di match, in base a quali parametri prelevare i giusti valori dall'array delle occorrenze trovate?
Codice PHP:
// istanziazione di 2 stringhe di test:
$string_1 = "books[1]";
$string_2 = "book.getTitle()";
$pattern = "/^([\w_]+)((\.([\w_]+)\(\))|(\[([0-9]+)\]))/s";
preg_match_all($pattern, $string_1, $matches, PREG_SET_ORDER);
Dando in pasto a preg_match_all i due pattern vengono catturate le seguenti occorrenze.
Per la prima stringa:
codice:
Array
(
[0] => Array
(
[0] => books[1]
[1] => books
[2] => [1]
[3] =>
[4] =>
[5] => [1]
[6] => 1
)
)
di cui mi interessano la sottoespressione con indice 1 e quella con indice 6 (cioè nome array e indice).
Per la seconda stringa:
codice:
Array
(
[0] => Array
(
[0] => book.getTitle()
[1] => book
[2] => .getTitle()
[3] => .getTitle()
[4] => getTitle
)
)
di cui mi interessano la sottoespressione con indice 1 e quella con indice 4 (ovvero, nome oggetto e metodo).
In base a quale criterio stabilire se la stringa controllata appartiene alla prima sintassi o alla seconda? Il numero di occorrenze delle sottoespressioni trovate?
@flash.tato: in che senso dicevi di voler scrivere un parser per il template? In un altro linguaggio? Da dove partiresti? E come si interfaccerebbe con PHP?