Ik zit mijn message board wat an te passen en ben nu een fatsoenlijke quote code te schrijven. Echter loop ik op een probleem.

Ik heb de volgende code voor de quote tags:

	$bericht = preg_replace("#\[quote=(.*?)\](.*?)\[/quote\]#si", '<font size="2" face="Arial, Helvetica, sans-serif"> \\1 zei: <p style="background-color:#D8D8D8;border-style: dotted; padding: 5px; width: 90%;"><i>\\2</i></p></font><br /><br />', $bericht);


wanneer ik een enkel bericht quote gaat het prima. Maar wanneer ik een bericht quote waar al een quote in staat dan gaat het fout.

Zoals dit:

 [quote]
[quote]eerste tekst in de quote[/quote] 

de tekst die wordt geleverd om op de bovenstaande quote te reageren[/quote]


Logisch dat hij fout gaat, hij pak de eeste quote open tag en zoekt naar de eerste quote sluit tag, maar dat moet hij niet doen, hij moet de laatste pakken.

Als voorbeeld kan ik een link geven van mijn websiteje waar het fout gaat:

http://www.pcrrules.nl/forum/read.php?2,6364,6366#6366

ik hoop dat jullie begrijpen wat ik bedoel, en uiteraard hoop ik dat er een oplossing voor is.
Opgelost,

vrij simpel ik dacht te moeilijk. ik moest alleen de open en dicht tags van de quotes in een aparte preg_replace zetten. Nu doet hij het naar mijn zin. sorry voor de onnodige post.
@Roeland
Kan je dan ook even de oplossing hier plaatsen (dus de goede manier om dit te bereiken?)
En ondersteund jou oplossing dan ook quote in quote in quote ?
<?php
while (preg_match('#\[quote=(.+?)\](.+?)\[/quote\]#is', $bericht))
    {
        $bericht = preg_replace('#\[quote=(.+?)\](.+?)\[/quote\]#is','<hr style="border:1px dashed orange;" noshade /><div class="quote"><b><small><i><span style="color: #999;">\\1</span></i></b><small>\\2</small></div>',$bericht);
    }
?>


Deze wel, maar alle eer naar Rafael :)
Ja het ondersteund dan ook quote in een quote (of meerdere natuurlijk).

Eerst had ik (wat fout is) dit, de open en sluit tag van de quote in 1 preg replace:
$bericht = preg_replace("#\[quote=(.*?)\](.*?)\[/quote\]#si", '<font size="2" face="Arial, Helvetica, sans-serif"> \\1 zei: <p style="background-color:#D8D8D8;border-style: dotted; padding: 5px; width: 90%;"><i>\\2</i></p></font><br /><br />', $bericht);


Hij zoekt nu alleen naar een string als
[quote=naam]bericht[/quote]
. Omdat er bij een quote in een quote de tags van het openen en het sluiten van de verschillende quotes door elkaar heen lopen:

[quote]     [quote][/quote]    [/quote]


Kan hij de string die je opgeef in de preg_replace maar 1 keer vinden. Wanneer je de string in de preg_replace splitst, dus 1 preg_replace voor de open quote tag en 1 preg_replace voor de sluit quote tag, kan de quote wel goed omzetten naar de gewenste lay-out.

Nu heb ik twee preg_replaces gemaakt, 1 voor de open tag, 1 voor de sluit tag (wat goed is):

Open tag:
	$body = preg_replace("#\[quote=(.*?)\]#si", '<font size="2" face="Arial, Helvetica, sans-serif"> \\1 zei: <p style="background-color:#D8D8D8;border-style: dotted; padding: 5px; width: 90%;"><i>', $body);


Sluit tag:
	$body = preg_replace("#\[/quote\]#si", '</i></p></font>', $body);



Dit werkt perfect. hopelijk is het zo duidelijk.
Roeland, die methode heb ik ook vroeger vaak gebruikt, maar is toch niet echt ideaal:

Stel: Je hebt je layout in divjes (kan ook tabellen, maar daar heb ik het niet over.. doe maar divjes :P) en je quote-dingen heb je ook in divjes. Stel nu dat iemand zoiets typt:

[quote]Dit is 1 quote[/quote]

Och neen, ik heb een quote teveel afgesloten
[/quote]


Wat denk je dat er met je layout gebeurd? En de mensen die zo'n layout zien?

Nu is er een andere oplossing voor jouw probleem:


<?php
while(preg_match('#\[quote\](.*?)\[/quote]\#', $tekst))
{
$tekst = preg_replace('#\[quote\](.*?)\[/quote]\#', '<div>Quote: $1</div>', $tekst);
}
// Dit stukje is niet getest (zoiets heb ik wel.. dus de opzet is goed)
?>


[edit]
Dit is eigenlijk ook de code die Erik poste (niet over genomen hoor ;-) maar werkt hetzelfde)

Ik denk dat ik een beetje lang aan het typen was :P
[/edit]
Miloan, niet echt aan gedacht nee, zo kan er gemakkelijk met je lay-out gekloot worden. Ik zal jou oplossing eens proberen.

Reageren