Hallo devvers 
Ik zit met een ontwerpprobleem waar ik niet zo heel snel uit kom. Ik hoop dat jullie me wat inzichten kunnen geven hoe ik dit probleem het beste kan tackelen.
Beoogd doel
Ik wil door middel van Perl Compatible Regular Expressions (PCRE) in PHP een parser maken die de volgende code omzet naar HTML-style tags, gebruikmakende van korte eindtags:
[b][i]bla[/][/]
naar:
<b><i>bla</i></b>
Het probleem
Bovenstaand voorbeeld is simpel zat en zonder gebruik te maken van korte eindtags is dat ook simpel te implementeren. Het probleem ontstaat wanneer ik korte eindtags wil gebruiken (dus: [/]) omdat de volgorde van parsing dan verkeerd kan lopen.
Gebruik ik greedy parsing, dus de regular expression grijpt zo'n lang mogelijke string, dan kan de parsing er zo uitzien wanneer de [i]-tag als eerste wordt geparsed:
<b><i>bla</b></i>
Andersom kan bij ungreedy parsing (zo'n kort mogelijke match) de [b]-tag ervoor zorgen dat het zaakje eveneens wordt geparsed als:
<b><i>bla</b></i>
Uiteraard wil ik de juiste volgorde aanhouden, het moet worden:
<b><i>bla</i></b>
Ook de volgorde van het parsen mag niets uitmaken. Het moet dus ook werken als ik:
[i][b]bla[/b][/i]
wil parsen naar:
<i><b>bla</b></i>
Mogelijke oplossingen
Greedy of ungreedy parsing gaat me hier niet bij helpen. De enige oplossing die ik kon verzinnen is om het parsen in meerdere stappen te doen, en de regexp zo te schrijven dat er tussen de [b]...[/b] geen andere tags zoals [i] mogen voorkomen. Het gevolg is dat tags eigenlijk seriëel geparsed moeten worden, totdat de laatste iteratie geen matches meer oplevert.
Dit is echter wel een complexere en tragere oplossing. Weten jullie een betere? Tweakers.net heeft dit zelf zo in gebruik. Ik hoef geen code te zien, maar wat hints voor ontwerp en aanpak zou wel welkom zijn!
Alvast heel erg bedankt voor het meedenken!
Ik zit met een ontwerpprobleem waar ik niet zo heel snel uit kom. Ik hoop dat jullie me wat inzichten kunnen geven hoe ik dit probleem het beste kan tackelen.
Beoogd doel
Ik wil door middel van Perl Compatible Regular Expressions (PCRE) in PHP een parser maken die de volgende code omzet naar HTML-style tags, gebruikmakende van korte eindtags:
[b][i]bla[/][/]
naar:
<b><i>bla</i></b>
Het probleem
Bovenstaand voorbeeld is simpel zat en zonder gebruik te maken van korte eindtags is dat ook simpel te implementeren. Het probleem ontstaat wanneer ik korte eindtags wil gebruiken (dus: [/]) omdat de volgorde van parsing dan verkeerd kan lopen.
Gebruik ik greedy parsing, dus de regular expression grijpt zo'n lang mogelijke string, dan kan de parsing er zo uitzien wanneer de [i]-tag als eerste wordt geparsed:
<b><i>bla</b></i>
Andersom kan bij ungreedy parsing (zo'n kort mogelijke match) de [b]-tag ervoor zorgen dat het zaakje eveneens wordt geparsed als:
<b><i>bla</b></i>
Uiteraard wil ik de juiste volgorde aanhouden, het moet worden:
<b><i>bla</i></b>
Ook de volgorde van het parsen mag niets uitmaken. Het moet dus ook werken als ik:
[i][b]bla[/b][/i]
wil parsen naar:
<i><b>bla</b></i>
Mogelijke oplossingen
Greedy of ungreedy parsing gaat me hier niet bij helpen. De enige oplossing die ik kon verzinnen is om het parsen in meerdere stappen te doen, en de regexp zo te schrijven dat er tussen de [b]...[/b] geen andere tags zoals [i] mogen voorkomen. Het gevolg is dat tags eigenlijk seriëel geparsed moeten worden, totdat de laatste iteratie geen matches meer oplevert.
Dit is echter wel een complexere en tragere oplossing. Weten jullie een betere? Tweakers.net heeft dit zelf zo in gebruik. Ik hoef geen code te zien, maar wat hints voor ontwerp en aanpak zou wel welkom zijn!
Alvast heel erg bedankt voor het meedenken!