Als ik een stuk tekst (of template) uit m'n database trek, zoekt een functie naar bepaalde tokens in de tekst, bijvoorbeeld {datum|kort} en {username}. Deze tokens verwijzen elk naar een eigen functie, die een stukje gerenderde output teruggeeft, bijvoorbeeld:
Na een hoop gepruts heb ik de volgende regex hiervoor:
Deze werkt bijna, maar nog niet helemaal. Ik wil dat [nocode][/nocode] paren die genest staan, genegeerd worden. Nu is dat nog niet het geval. Een aantal voorbeelden:
En dat laatste klopt dus niet. De eerste [nocode] wordt afgesloten door de eerste [/nocode], maar zou eigenlijk pas door de laatste [/nocode] moeten worden afgesloten.
PHP:
Maar soms wil ik niet dat de tokens worden uitgevoerd, bijvoorbeeld in een stukje uitleg: "als de gebruiker ergens de datum wil neerzetten, kan hij gebruik maken van de {datum} token". De oplossing is volgens mij om aparte [nocode] token te maken: [nocode] hier tekst met een {datum} token enzo[/nocode] en hier de {datum}". De eerste {datum} blijft staan, de tweede wordt vervangen door de datum zelf.1
2
3
4
5
6
7
8
| function datum($type) { return ($type == 'kort') ? '8 Augustus' : '2006-08-08'; } function username() { global $user; return $user->name; } |
Na een hoop gepruts heb ik de volgende regex hiervoor:
PHP:
1
| preg_match_all('#\[nocode](.*?)\\[/nocode\]#', $text, $matches); |
Deze werkt bijna, maar nog niet helemaal. Ik wil dat [nocode][/nocode] paren die genest staan, genegeerd worden. Nu is dat nog niet het geval. Een aantal voorbeelden:
PHP:
1
2
3
4
5
6
7
8
| $text = 'Hier een [nocode]{datum}[/nocode] en hier een {datum}'; // en $text = 'Hier een [nocode]{datum}[/nocode] en hier een [nocode]{datum}'; // $matches[0][0] = [nocode]{datum}[/nocode] // $matches[1][0] = {datum} $text = 'Hier een [nocode][nocode]{datum}[/nocode] en hier[/nocode] een {datum}'; // $matches[0][0] = [nocode][nocode]{datum}[/nocode] // $matches[0][1] = [nocode]{datum} |
En dat laatste klopt dus niet. De eerste [nocode] wordt afgesloten door de eerste [/nocode], maar zou eigenlijk pas door de laatste [/nocode] moeten worden afgesloten.
- Hoe pas ik de regex aan zodat hij kijkt of er sluitende paren zijn?
- Hoe moet de regex eigenlijk reageren als er een aantal geneste [nocode] tags zijn en er bijvoorbeeld 1 afsluitende tag te weinig is?
"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."