Gå til innhold

To [quote] (bbcode) inni hverandre


Anbefalte innlegg

Det er noen svar man finner ut av om man tenker lenge nok, men som sansynligvis noen andre har tenkt før deg. Derfor spør jeg liksågodt og hører om ikke noen har funnet en løsning før meg:

 

I forumet (mitt) er det en sitatfunksjon, som blir helt gal om man siterer flere ting inni hverandre:

 

[sitat]

Enda et sitat

[sitat]

Sitat

[/sitat]

[/sitat]

 

...og den blir absolutt ikke seende slik ut:

 

Enda et sitat
Sitat

 

...men derimot blir [sitat] stående som ren tekst inni den første sitat-boksen.

 

$text = preg_replace("#\[sitat\](.*?)\[/sitat\]#is", "<b>Sitat</b><br /><div class=\"quote\">\\1</div>", $text);

 

Hvordan skal jeg få det så flott og fancy som i dette forumet?

Lenke til kommentar
Videoannonse
Annonse

Post-parser for VikingBoard

 

Jeg løste det ganske enkelt ved å parse første del av quoten først, og så ta slutten. Kanskje ikke den mest elegante måten å gjøre det på, men det funker noenlunde greit.

 

EDIT: La til kode:

 

//New, hopefully working BBCode for QUOTES
 	
   //if there is no =-character, do it the lazy way:
   $post = preg_replace("#\[quote\]#is", "<fieldset class=\"quote\"><legend>QUOTE:</legend><p class=\"nopadding\">", $post);
   
   //else, do it properly
   $post = preg_replace("#\[quote=(.+?)\]#is", "<fieldset class=\"quote\"><legend>QUOTE: $1</legend><p class=\"nopadding\">", $post);
   
   
   //then the data and the footer
   $post = preg_replace("#(.+?)\[/quote\]#is", "" . str_replace("<br>", "", "$1") . "</p></fieldset>", $post);

Endret av jorgis
Lenke til kommentar
  • 3 uker senere...

Jeg har en litt annen innfallsvinkel på bbcode parsingen.

Den ser slik ut (Kraftig klippet, kun tatt med det som er vesentlig):

<?php
//så lenge det finnes åpne/lukke tagger så...
while(preg_match("/\[(\w+)=?([^\]])*\](.+?)\[\/\\1\]/s",$post)) {
$post = preg_replace_callback("/\[(\w+)=?([^\]]*)\](.+?)(\[\/\\1\]|(?=\[\\1))/s","bbcode_parser",$post);
}

function bbcode_parser($match) {
$match[3] = preg_replace_callback("/\[(\w+)=?([^\]]*)\](.*?)(\[\/\\1\]|(?=\[\\1))/s","bbcode_parser",$match[3]);
$lazy = ($match[2]=="") ? true : false;
$closing = ($match[4]=="") ? false : true;
switch(strtolower($match[1])) {
 case "quote":
 	if($closing) {
   return "<fieldset class=\"quote\"><legend>QUOTE: {$match[2]}</legend><p>{$match[3]}</p></fieldset>";
 	} else {
   return $match[0]; //Ikke fåreta erstatning. Vent til neste gang, og sjekk om quoten er lukket da.
 	}
 default:
 	return $match[3];  //Tar bort ukjente bbcode tags
}
}
?>

Det er enkelt å legge til nye typer tags, ettersom det bare er å lage en ny case.

Den søker bare gjennom posten hvis der finnes bbcode, og ellers så kjøres den bare så mange ganger som du har max antall nivåer av nesting av f.eks quotes eller lister.

Hvis du har lyst på bedre kommentert og komplett kode, så si i fra.

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

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