Avatar billede woowii Nybegynder
14. august 2005 - 23:29 Der er 11 kommentarer og
1 løsning

replace mere end en gang

Hey,

$tekst = preg_replace("/\[quote=(.+?)\](.+?)\[\/quote\]/", "<table width=\"90%\" class=\"quotenavn\"><tr><font size='$forumquotenavn_size' color='$forumquotenavn_color'>$1 skrev:</font></tr></table><table width=\"94%\" class=\"quote\"><tr><td align=\"left\"><font color='$forumquote_color' size='$forumquote_size'>$2</font></td></tr></table>", $reply['tekst']);

Sådan ser koden ud - problemet er at den kun bliver "kørt" en gang. Som det fremgår er det en quote funktion der laver [quote=navn]tekst[/quote] om til tabeller - men hvis du laver quote på en allerede quotet sætning (så man får mere end én [quote][/quote]) er det kun den første der bliver lavet om. Det er jo ikke helt optimalt, men jeg kan ikke umildbart finde nogen løsning på problemet, så derfor må jeg søge hjælp. :)
Avatar billede erikjacobsen Ekspert
14. august 2005 - 23:39 #1
"/\[quote=(.+?)\](.+?)\[\/quote\]/g"
Avatar billede coderdk Praktikant
15. august 2005 - 02:38 #2
Jeg vil nu skyde på:

"/\[quote=(.+?)\](.+?)\[\/quote\]/s"
Avatar billede woowii Nybegynder
15. august 2005 - 14:22 #3
Ingen af delene hjalp, desværre. Da jeg brugte "/g" kom der intet overhovedet.
Avatar billede coderdk Praktikant
15. august 2005 - 14:25 #4
Hmmm, /s burde have gjort det... Kigger på det senere hvis jeg husker det :)
Avatar billede woowii Nybegynder
15. august 2005 - 14:46 #5
Efter at have testet lidt mere er jeg kommet frem til at det virker fint, så længe quotes ikke er lige efter hinanden. Altså:
[quote=navn]tekst[/quote][quote=navn]tekst[/quote] virker efter hensigten, men:
[quote=navn][quote=navn]tekst[/quote][/quote] virker ikke - hvilket jo egentlig er forståeligt nok, nu jeg tænker over det. Så problemet er ikke at den ikke bliver kørt flere gange - problemet er at koden er "forkert" (i hvert fald til det som jeg skal bruge den til).
Avatar billede coderdk Praktikant
15. august 2005 - 15:10 #6
Ja, du kan ikke neste quotes på den måde, så skal du til at gøre det på en anden måde og bruge en stack - Så er det pludselig lidt mere komplekst ;)
Avatar billede woowii Nybegynder
15. august 2005 - 16:51 #7
Hvis jeg sætter en linje magen til ind (som laver samme replace på $tekst) laver den to quotes - ville det være en mulighed at lave en løkke (el.lign) som kørte linjen 10 gange, hvergang med den nye variable? :)
Avatar billede coderdk Praktikant
15. august 2005 - 20:20 #8
Jooh, du kan dog ikke være 100% sikker på resultatet, og det vil sikkert ikke være korrekt hver gang, den erstatter dem således:

[quote=navn][quote=navn]tekst[/quote][/quote]

bliver første gang til:

[erstattet1][quote=navn]tekst[erstattet1][/quote]

og næste til:

[erstattet1][erstattet2]tekst[/erstattet1][/erstattet2]

Den korrekte er:

[erstattet2][erstattet1]tekst[/erstattet1][/erstattet2]

Når du alligevel laver noget så upræcist, kunne du egentlig godt bare lave det ved, først at erstatte alle [quote=navn] med den første del, og derefter erstatte [/quote] med resten, hvis du forstår.

Og hvorfor bruger du egentlig ikke <blockquote><div class="qnavn">$1 skrev:</div><div class="qtext">$2</div></blockquote>
Og så tilpasser CSS'en til <blockquote> og laver to klasser?
Avatar billede woowii Nybegynder
15. august 2005 - 20:34 #9
At erstatte dem hver for sig var hvad jeg gjorde før - men det giver nogle problemer hvis folk ikke får lavet fejl i det. Giver fejl i designet. Kan dog godt være at det ikke ville være så slemt hvis jeg brugte divs - vil jeg lige teste. :)

Ang. divs, så har jeg altid brugt tabeller af en eller anden grund - har altid virket fint til mit behov, så har ikke set nogen grund til at benytte divs. :)
Avatar billede coderdk Praktikant
15. august 2005 - 20:56 #10
Du kan evt gøre sådan:

$count = 0;
if ( $text = preg_replace( "/\[quote=(.+)?\]/s", "<blockquote><div class='qnavn'>\\1 skrev:</div>", $text, -1, $count ) )
{
  $count2 = 0;
  $text = preg_replace( "/\[\/quote\]/s", "</blockquote>", $text, -1, $count2 );
  if ( $count2 < $count )
  {
    for ( $i = $count2; $i < $count; $i++ )
    {
        $text .= "</blockquote>";
    }
  }
  elseif ( $count < $count2 )
  {
    for ( $i = $count; $i < $count2; $i++ )
    {
        $text = "<blockquote>" . $text;
    }
  }
}

Ved ikke om det vil virke helt, men det kan være at det "reparerer" lidt på folks slemme beskeder ;)
Avatar billede woowii Nybegynder
15. august 2005 - 21:26 #11
Tog den lette løsning med <div> - hvis folk laver det forkert er skaden minimal alligevel, så gider ikke lægge mere arbejde i det lige nu. :)

Tak for hjælpen, smid et svar så du kan få dine fortjente point. :)
Avatar billede coderdk Praktikant
15. august 2005 - 22:58 #12
Ok :) Nu jeg kigger på det jeg skrev så burde det faktisk umiddelbart virke (som en halvdårlig lap)...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester