Olen tässä tekemässä omaa keskustelualuetta.
Kaikki on menny tähän asti hyvin. Nyt olen kuitenkin törmännyt erääseen ongelmaan lainauksien kanssa.
Ongelma koskee sisäkkäisiä lainauksia.
Käytän tällaista koodia:
<?php $teksti = 'alkutekstiä [lainaus "Seppo"]sepi kirjoitti tämän [lainauS "Keijo"]keijo kirjoitti tämän[/lainaus] välitekstiä [/lainaus] lopputekstiä'; $teksti = preg_replace('/(.*)(\[lainaus "?)(.+)("\]?)(.*)(\[\/lainaus\]?)/', '$1<i><small>$3 kirjoitti:</small></i><div id="lainaus">$5</div>', $teksti); ?>
Tämä toimii täydellisesti yhdellä lainauksella, mutta sisäkkäisten kanssa tilanne muuttuu. Kyseinen preg pätkä aloittaa lainaamisen toisesta lainaus tagista ja lopettaa sen viimeiseen lainauksen lopetustagiin.
Osaisiko joku neuvoa oikean ratkaisun preg_replacella käyttämättä ns. "purkkaratkaisuja" eli str_replacea, substr:ia ja muita tällaisia funktioita?
Omassa foorumissani on seuraavanlainen systeemi:
$quote_pattern = "%\[quote=(.*?)\](<br />)*(.*?)\[/quote\](<br />)*%is"; $quote_replace = "<div class=\"quote\">\\1 wrote:</div><div class=\"quote_text\">\\3</div>"; while( preg_match($quote_pattern, $input) ) { $input = preg_replace($quote_pattern, $quote_replace, $input); }
Jos et osaa soveltaa niin kysy ihmeessä lisää.
Kiitos! Sain toimimaan.
Tällä tavalla sen tein. En kyllä osaa tuota regexiä riittävästi, jotta tajuaisin toimintaperiaatteen täysin. Soveltamiseen taitoni kuitenkin riittivät.
<?php $lainaus_pattern = "%\[lainaus \"(.*?)\"\](.*?)\[/lainaus\]%is"; $lainaus_replace = '<small>$1 kirjoitti:</small></i><div id="lainaus">$2</div>'; while( preg_match($lainaus_pattern, $teksti) ) { $teksti = preg_replace($lainaus_pattern, $lainaus_replace, $teksti); } ?>
Aihe on jo aika vanha, joten et voi enää vastata siihen.