Avatar billede mm12010 Nybegynder
03. april 2003 - 14:30 Der er 9 kommentarer og
1 løsning

optimer RegExp

Hvordan kan følgende man optimere eller lave følge kode smartere?

    txt = txt.replace(new RegExp("[\[]link=([^\]]+)\]([^\[]+)[\[]\/link[\]]", "gi"), "<a href=\"$1\">$2</a>");
    txt = txt.replace(new RegExp("target=_", "gi"), "\" target=\"_");
    txt = txt.replace(new RegExp("[\[]b[\]]", "gi"), "<strong>");
    txt = txt.replace(new RegExp("[\[]\/b[\]]", "gi"), "</strong>");
    txt = txt.replace(new RegExp("[\[]i[\]]", "gi"), "<em>");
    txt = txt.replace(new RegExp("[\[]\/i[\]]", "gi"), "</em>");
    txt = txt.replace(new RegExp("[\[]u[\]]", "gi"), "<u>");
    txt = txt.replace(new RegExp("[\[]\/u[\]]", "gi"), "</u>");

Da dette er først gang jeg bruger RegExp er jeg meget modtaglig overfor kommentaerer, kritik, tips og trix :o)
Avatar billede jespernaur Nybegynder
03. april 2003 - 18:40 #1
1. Tegnklasser på 1 tegn (som du har mange af) er overflødige, eksempel: [\[] er helt ækvivalent med \[ - det er først hvis du ønsker at matche flere forskellige muligheder på en tegnposition, at en tegnklasse er på sin plads. Eksempel: [abc]d tillader strengene ad, bd og cd. Du kan med andre ord ændre

    txt = txt.replace(new RegExp("[\[]b[\]]", "gi"), "<strong>");
til
    txt = txt.replace(new RegExp("\[b\]", "gi"), "<strong>");

og opnå samme effekt.

2. I din aktuelle opgave, hvor du ønsker at erstatte med <strong>, samt til </strong>, kan man slå det lidt sammen:

    txt = txt.replace(new RegExp("[\[]b[\]]", "gi"), "<strong>");
    txt = txt.replace(new RegExp("[\[]\/b[\]]", "gi"), "</strong>");

rettes til:

    txt = txt.replace(new RegExp("\[(\/?)b\]", "gi"), "<$1strong>");

hvor vi bruger ? til at tillade 0 eller 1 forekomst af /. Samme princip kan bruges ved [i] og [u].

Anbefaling: Bogen "Mastering Regular Expressions" af Jeffrey Friedl, udgivet af O'Reilly.

Mvh
Jesper Naur
Avatar billede mm12010 Nybegynder
03. april 2003 - 19:27 #2
hvad med de 2 øverste:
   
    txt = txt.replace(new RegExp("[\[]link=([^\]]+)\]([^\[]+)[\[]\/link[\]]", "gi"), "<a href=\"$1\">$2</a>");
    txt = txt.replace(new RegExp("target=_", "gi"), "\" target=\"_");

kan de ikke forenkles, forkortes eller optimeres?
Avatar billede jespernaur Nybegynder
03. april 2003 - 19:32 #3
Den første kan forenkles en anelse, til:

    txt = txt.replace(new RegExp("\[link=([^\]]+)\]([^\[]+)\[\/link\]", "gi"), "<a href=\"$1\">$2</a>");

men der er ikke tale om andet end fjernelse af 2 allerede omtalte "1-tegns tegnklasser".

I nummer 2 er der ikke noget at hente.
Avatar billede mm12010 Nybegynder
03. april 2003 - 20:01 #4
hmmm... jeg kan ikke få noget det til at give det ønkede resultat.

    txt = txt.replace(new RegExp("[\[]link=([^\]]+)\]([^\[]+)[\[]\/link[\]]", "gi"), "<a href=\"$1\">$2</a>");
skulle erstatte:
    [link=http://www.url.dk target=_blank]Link Tekst[/link]
med:
    <a href="http://www.url.dk target=_blank">Link Tekst</a>
hvorefter denne:
    txt = txt.replace(new RegExp("target=_", "gi"), "\" target=\"_");
skulle erstatte:
    target=_
med:
    " target="_

de efterfølgende 6 linier skulle så enten b, i, u med den respektive HTML betegnelse:
txt = txt.replace(new RegExp("[\[]b[\]]", "gi"), "<strong>");
    txt = txt.replace(new RegExp("[\[]\/b[\]]", "gi"), "</strong>");
    txt = txt.replace(new RegExp("[\[]i[\]]", "gi"), "<em>");
    txt = txt.replace(new RegExp("[\[]\/i[\]]", "gi"), "</em>");
    txt = txt.replace(new RegExp("[\[]u[\]]", "gi"), "<u>");
    txt = txt.replace(new RegExp("[\[]\/u[\]]", "gi"), "</u>");
ex:
    Tekst
skulle blive til:
    <strong>Tekst</strong>

-----------------------------------------------------------------

MEN

denne:
    txt = txt.replace(new RegExp("\[link=([^\]]+)\]([^\[]+)\[\/link\]", "gi"), "<a href=\"$1\">$2</a>");
giver fejl:
    Microsoft JScript runtime error '800a1399'

    Syntax error in regular expression

og denne:
    txt = txt.replace(new RegExp("\[(\/?)b\]", "gi"), "<$1strong>");
giver:
    [<$1strong>]eval Method[<$1strong><$1strong>]
derudovererstatter den også b, /, (, ), muligvis flere tegn med:
    <$1strong>

--------------------------------------------------------------------------

Er der noget specielt jeg skal vide inden jeg bruger RegExp, eller er det koden den er gal med?
Avatar billede jespernaur Nybegynder
03. april 2003 - 20:58 #5
Vi laver lige en ændring:

Den første ændres til
  txt = txt.replace(/\[link=([^\]]+)\]([^\[]+)\[\/link\]/gi, "<a href=\"$1\">$2</a>");

De følgende ændres til
  txt = txt.replace(/\[(\/?)b\]/gi, "<$1strong>");

osv.

Man k-a-n godt gøre som du er begyndt på, med new RegExp. Problemet er, at når det regulære udtryk i sig selv er en streng inde i "", er man nødt til at 'escape' escape-tegnet \, hvilket medfører, at udtrykket bliver næsten ulæseligt. Her ses hvordan det ser ud i de små udtryk. Den første (lange) forbigår vi i tavshed.

  txt = txt.replace(new RegExp("\\[(\\/?)b\\]", "gi"), "<$1strong>");
Avatar billede mm12010 Nybegynder
03. april 2003 - 22:08 #6
gode svar med gode forklaringer!

tusind tak for hjælpen :o)
Avatar billede mm12010 Nybegynder
03. april 2003 - 22:13 #7
hvis jeg nu slette alle forekomster af alle de strenge jeg har søgt på kan det så gøres med ét udtryk eller skal jeg dem alle sammen igennem igen?
Avatar billede jespernaur Nybegynder
03. april 2003 - 22:28 #8
Vil det sige, at du vil erstatte samtlige forekomster af , , , , , med ingenting? Hvis det er det du vil, burde det kunne klares med

    txt = txt.replace(/\[\/?b\]|\[\/?i\]|\[\/?u\]/gi, "");

Det nye i denne løsning er tegnet | som nærmest betyder 'eller'.
Avatar billede mm12010 Nybegynder
03. april 2003 - 23:22 #9
takker igen igen :o)
Avatar billede mm12010 Nybegynder
04. april 2003 - 14:11 #10
har lige et sidste spg:

jeg prøver at skrive disse 2 sammen til en:
    txt = txt.replace(/\[link=([^\]]+)\]([^\[]+)\[\/link\]/gi, "<a href=\"$1\">$2</a>");
    txt = txt.replace(new RegExp("target=_", "gi"), "\" target=\"_");
mit forsøg som ikke virker:
    txt = txt.replace(/\[link=([.+\s])target=(\w.+\]]+)\]]([^\[]+)\[\/link\]/gi, "<a href=\"$1\" target=\"$2\">$3</a>");
skulle kunne erstatte:
    [link=http://www.url.dk target=_blank]Link Tekst[/link]
med:
    <a href="http://www.url.dk" target="_blank">Link Tekst</a>

så til, så opretter jeg gerne et nyt spg, så du kan få lidt for det :o)
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