Guffa | Foto | Programmering

RegExp del 1 - enkel ersättning

RegExp-objektet kan bland annat användas för att ersätta text i en sträng. Även de enklaste formerna av ersättning är mycket kraftfullare än den vanliga Replace-funktionen.

Det vi ska använda det till nu, är att göra fetstil av [b]text[/b] och kursiv stil av [i]text[/i]. Det kan man ju visserligen göra genom att ersätta [ med < och ] med >, men finessen är att vi bara kommer att ersätta just de här varianterna. Det gör att man inte kan använda funktionen till att göra något elakt, som till exempel: [script]for(;true;)alert("Mouhahahaha!");[/script]. Dessutom så ersätter vi dem bara om både början och slut finns, man kan alltså inte skriva bara [b] och göra resten av sidan till fetstil.

För att använda ett RegExp-objekt så måste vi först skapa ett. När man bara ska använda det till något enkelt, brukar jag skapa det direkt i en With-sats. Då behöver man ingen variabel för objektet. Objektet finns ändra fram till End With, och sedan behöver vi det inte längre.

With New RegExp
   ...här skriver vi koden som använder objektet
End With

Vi vill att ersättningen ska göras på alla förekomster som objektet hittar, så vi får ställa in det i objektet. När vi skriver .Global så betyder det egenskapen Global i objektet som står i With-satsen.

   .Global = True

Sedan vill vi att objektet inte ska bry sig om stora eller små bokstäver när det söker:

   .IgnoreCase = True

Objektet behöver ett mönster för att veta vad det ska söka efter. Vi vill göra så att den letar upp en markering för fetstil; om man skriver [b]så här[/b] så ska den hitta det.

Klamrarna är specialtecken i mönstret, så vi får sätta \ framför dem för att objektet ska förstå att vi menar att det ska leta efter klamrar: [b] och [/b] blir alltså \[b\] och \[/b\].

Mellan dessa så ska mönstret hitta vilka tecken som helst, så vi gör en teckenuppsättning med alla tecken. Det är just teckenuppsättningar som klamrarna används till. Koden \w matchar tecknen A-Z, a-z, 0-9 och _. Koden \W matchar alla övriga tecken. För att göra en teckenuppsättning med alla tecken kan man alltså skriva: [\w\W].

Teckenuppsättningen matchar bara ett enda tecken, så vi lägger på en asterisk efter den. Det betyder att den matchar noll eller fler tecken. Sedan lägger vi ett frågetecken efter asterisken, vilket betyder att den ska matcha så få tecken som möjligt. Det gör vi för att den ska passa ihop [b] med den närmaste [/b] istället för den sista som finns i strängen.

Slutligen sätter vi parenteser runt det som står mellan [b] och [/b], det gör att vi kan använda det värdet i strängen som vi ska ersätta med.

   .Pattern = "\[b\]([\w\W]*?)\[/b\]"

Nu kan vi ersätta [b]vadsomhelst[/b] med <b>vadsomhelst</b>. Där vi skriver $1 i strängen som vi ersätter med, kommer tecknen att hamna som passade mot det inom parenteserna i mönstret. Ifall vi hittade [b]hejsan[/b], så kommer $1 att ersättas av hejsan.

strValue = .Replace(strValue,"<b>$1</b>")

Nu kan vi använda objektet för att ersätta fler saker. Det är bara att sätta ett nytt mönster. Vi letar efter [i]vadsomhelst[/i]:

   .Pattern = "\[i\]([\w\W]*?)\[/i\]"

Och ersätter med <i>vadsomhelst</i>:

   strValue = .Replace(strValue,"<i>$1</i>")

Ifall vi sätter ihop alltihop så blir det:

With New RegExp

   .Global = True
   .IgnoreCase = True

   .Pattern = "\[b\]([\w\W]*?)\[/b\]"
   strValue = .Replace(strValue,"<b>$1</b>")

   .Pattern = "\[i\]([\w\W]*?)\[/i\]"
   strValue = .Replace(strValue,"<i>$1</i>")

End With

Nu kanske du inte tycker att det här var så väldigt enkelt, men i förhållande till vad man kan göra med ett RegExp-objekt, så är det här enkelt. Vi har bara skrapat lite på ytan än så länge...

Göran Andersson