Avatar billede fcknet Nybegynder
15. maj 2004 - 10:47 Der er 13 kommentarer og
1 løsning

Regexp går i kage ved brug flere gange i samme tekst

Jeg har følgende regular expression:

$tekst = preg_replace("#\[b\](.+)\[\/b\]#i", "<b>\\1</b>", $tekst);

der som I nok kan se skal erstatte tekst med <b>tekst</b>.

Det virker fint når man skriver det EN gang, men hvis det bliver brugt flere gange i samme tekst går det i kage og den gør således:

tekst tekst her bla bla tekst slut
bliver erstattet med
<b>tekst[/b] tekst her bla bla tekst slut</b>

Altså går den første [b] sammen med den sidste
og så bliver de andre overset.
Avatar billede sukos Juniormester
15. maj 2004 - 11:05 #1
Hvorfor ikke bare
$tekst = str_replace("[", "<", $tekst);
$tekst = str_replace("]", ">", $tekst);
Avatar billede sukos Juniormester
15. maj 2004 - 11:06 #2
eller, hvis du kun bruger <b>
$tekst = str_replace("[b]", "<b>", $tekst);
$tekst = str_replace("[b]", "</b>", $tekst);
Avatar billede sukos Juniormester
15. maj 2004 - 11:35 #3
evt.

<?php
$tags = array("" => "<b>","" => "</b>", "[p]" => "<p>", "[/p]" => "</p>", "" => "<i>", "" => "</i>");

$tekst = "Hej du[p]Hvad så? Er du glad i dag? :O)";

echo strtr($tekst, $tags);
?>
Avatar billede olebole Juniormester
15. maj 2004 - 15:02 #4
<ole>

Du bør helt klart bruge strtr(), som sukos skriver i sit seneste indlæg - den er præcis bregnet til den slags 'oversættelser' (strtr = string-translate). Den er bedre performende end RegExp.

For en anden gangs skyld, kan du bruge en U-modifier i din RegExp:
  $tekst = preg_replace("/\[b\](.+)\[\/b\]/Ui", "<b>\\1</b>", $tekst);
... men her bør du som sagt bruge strtr() i stedet  ;o)

/mvh
</bole>
Avatar billede fcknet Nybegynder
15. maj 2004 - 15:53 #5
Tak for hjælpen.
Smider I et svar?
Avatar billede olebole Juniormester
15. maj 2004 - 16:07 #6
Det må være sukos' points. Han kom med den rigtige funktion  :)
/mvh
Avatar billede sukos Juniormester
15. maj 2004 - 16:09 #7
mjahh, jeg lærte først om funktionen igår, mener jeg, da du viste den i et andet spm, olebole! :O)
Avatar billede Slettet bruger
15. maj 2004 - 16:39 #8
Løsningen med strtr vil ikke sørge for kun at lave en start-tag for elementer, der også har en slut-tag.

Begge løsninger har problemer med forkert nestede elementer. Hej du!

Hvad gør man egentlig, hvis man gerne vil sikre sig, at resultatet er korrekt HTML?
Avatar billede sukos Juniormester
15. maj 2004 - 16:57 #9
? er ikke helt med på hvad du mener, sandbox?
Avatar billede olebole Juniormester
15. maj 2004 - 17:15 #10
Næh, det er der ingen problemer i. strtr() oversætter helt korrekt og bevarer den forkerte nesting.
Til gengæld har du en alvorlig fejl et andet sted, hvis fejl-nesting kan forekomme ... det må du rette, hvor det opstår  :)
Avatar billede Slettet bruger
15. maj 2004 - 17:56 #11
sukos: Følgende kode:

Her er tekst, der skal være fed.(/b) Nu kom fjolset til at skrive forkert.

strtr-løsningen vil give:

<b>Her er tekst, der skal være fed.(/b) Nu kom fjolset til at skrive forkert.

Dermed vil resten af teksten på siden måske blive fed. En regexp-baseret løsning vil som regel ikke ændre teksten.

Begge metoder vil normalt oversætte [b]Hej du!
til <b>Hej <i>du!</b></i>

olebole: Ja, men hvordan retter man det? Det kræver vel nærmest at man kører det gennem en HTML- eller XML-parser.
Avatar billede olebole Juniormester
15. maj 2004 - 18:27 #12
Nej, det kræver bare, man skriver en ordentlig kode. Hvis ikke folk kan skelne (b) fra [b], er der jo ikke grænser for, hvad man skal tage højde for
Avatar billede fcknet Nybegynder
16. maj 2004 - 09:23 #13
Jeg har nogle knapper som indsætter det, og har indtryk af at folk benytter dem, så det er ikke noget problem med (b) og andre fejltags.
Avatar billede Slettet bruger
16. maj 2004 - 18:31 #14
OK, så er problemet ikke så stort for dig.
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