simenss Skrevet 20. november 2006 Skrevet 20. november 2006 Jeg ønsker å konvertere BB-koder (slike vi bruker her på forumet) til HTML. En brukes skriver følgende tekst: svar 2 med quote fra svar 1 innlegg 1 [/quote ] svar 1 med quote fra innlegg 1 [/quote ][/i] Problemet som dukker opp er at quoten fra svar 1 også inneholder quoten fra innlegg 1. Altså: en quote er plassert innenfor en annen quote. preg_replace() gir da følgende tekst: svar 2 med quote fra svar 1 innlegg 1 svar 1 med quote fra innlegg 1 [/quote ][/i] Hvordan får jeg preg_replace() til å gjøre første og siste [/quote ] til en quote, og andre og nest siste [/quote ] til en quote osv.? Altså, gi brukeren mulighet til å sette en quote innenfor en annen quote og erstatte BB-koden slik at brukeren får denne teksten: svar 2 med quote fra svar 1 innlegg 1 svar 1 med quote fra innlegg 1
Peter Skrevet 20. november 2006 Skrevet 20. november 2006 Jeg tror det enkleste her er rekursjon, da vil du automagisk holde orden på rekkefølgen av taggene. Hver gang du kommer til en åpningstag, fyrer du opp en ny instans av funksjonen som leser frem til første tag den finner. Dersom taggen er lukketag, så er funksjonen ferdig. (dvs. den gjør sin erstatning og returnerer), dersom den kommer til en ny åpningstag, fyrer av en ny instans til av seg selv.
endrebjo Skrevet 20. november 2006 Skrevet 20. november 2006 (endret) Er ikke regex stort sett grådig da? Slik at den går til slutten av stringen og jobber seg tilbake igjen helt til den møter treff? Men da blir det kanskje litt problemer hvis du har flere quote-bokser som ikke er inni hverandre. Endret 20. november 2006 av endrebjorsvik
Peter Skrevet 20. november 2006 Skrevet 20. november 2006 Du kan velge om den skal være grådig eller ikke. Tror det er "U"-modifier (ungreedy)
AlecTBM Skrevet 21. november 2006 Skrevet 21. november 2006 Jeg har er fart at men må ha sI Prøvde sU men da kunne man kun ha 1 av hver bbkode.
TorS Skrevet 21. november 2006 Skrevet 21. november 2006 U (PCRE_UNGREEDY) This modifier inverts the "greediness" of the quantifiers so that they are not greedy by default, but become greedy if followed by "?". It is not compatible with Perl. It can also be set by a (?U) modifier setting within the pattern or by a question mark behind a quantifier (e.g. .*?). Som det står i manualen. Men som Nazgul sier, tror jeg at rekursjon kan være det enkleste her.
simenss Skrevet 22. november 2006 Forfatter Skrevet 22. november 2006 Koden er veldig enkel: function TextHTML($text,$bb_code) { $text = preg_replace('/&#/', '', nl2br(htmlentities($text, NULL, 'ISO-8859-15'))); // Håndterer feil i Opera if($bb_code) { $bb_code = array('/\[quote\](.+?)\[\/quote\]/is'); $html = array(''<blockquote>$1</blockquote>"); $text = preg_replace($bb_code, $html, $text); } return($text); }
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå