[PHP] Uitvoeren van macro's tegengaan

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
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:
PHP:
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;
}
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.

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."


Acties:
  • 0 Henk 'm!

  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

Stackbased gaan parsen. :) Er staan wat leuke topics in de search hierover. :)

Hier dus ;)

[ Voor 70% gewijzigd door RedRose op 08-08-2006 13:37 ]

Sundown Circus