ongelmana siis:
<?php function parseQuotesRecursive($input) { $regex = '#\[quote\=?"?(.*?)"?\]((?:[^[]|\[(?!/?quote\])|(?R))+)\[/quote\]#i'; if (is_array($input)) { $input = '<blockquote style="margin: 5px 20px 20px;">' .'<div class="quote-topic">' .'Quote'.( (strlen($input[1])>0) ? ' from <strong>'.$input[1].'</strong>' : '' ).',' .'</div>' .'<div class="quote-body">' .$input[2] .'</div>' .'</blockquote>'; } return preg_replace_callback($regex, 'parseQuotesRecursive', $input); } ?>
tarkotus siis, että pystyy tehä useemman kuin yhden quoten tyyliin:
moi kirjoitti:
moi kirjoitti:
123
functio toimii hyvin kunhan käyttää pelkkää
[quote][quote]123[/quote][/quote]
, mutta jos lisää vaikka
[quote="joku"][quote="joku"]123[/quote][/quote]
vain ensimmäinen quote toimii niinku pitää.
EDIT. kuva: http://img38.imageshack.us/img38/2544/moimx.jpg
Tuo preg_replace_callback on siinä määrin harvinainen funktio, että kun kirjoitat sen hakulaatikkoon, löydät keskustelusta erään koodini, jossa on toteutettu pinon avulla vastaavien tagien tunnistus. Ideana on siis sillä löytää kaikki tagit ja säilyttää pinossa avoimeksi jääneitä tageja eli toteuttaa tavallaan rekursio käsin. Idean saa toimimaan toivomallasi tavalla, kun lisää tunnistettaviin elementteihin vielä tagittoman tekstin, jolloin voi muotoilla sen aina pinon päällimmäisen tagin mukaan sopivasti.
Omasta funktiostasi pääset samaan tulokseen, kun et yritä hakea lausekkeella koko lainausta vaan vain seuraavan avaus- tai sulkutagin. Tagin tyypin perusteella voit sitten syventää rekursiota tai palata ylemmäs.
Aihe on jo aika vanha, joten et voi enää vastata siihen.