Gå til innhold

Problem med preg_replace (BB-koder og quote)


Anbefalte innlegg

Skrevet

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

Videoannonse
Annonse
Skrevet

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.

Skrevet (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. :hmm:

Endret av endrebjorsvik
Skrevet

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.

Skrevet

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

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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...