Gå til innhold

Problem med preg_replace (BB-koder og quote)


Anbefalte innlegg

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

Lenke til kommentar
Videoannonse
Annonse

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.

Lenke til kommentar

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.

Lenke til kommentar

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);
}

Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...