Eller: Hvordan konvertere phpBB til ren HTML i Access VBA
"Om du er en seriøs programmerer så bør RegExp sitte i fingertuppene"
Hørt noe tilsvarende?
Vel, fikk i oppgave her forleden og konvertere ett phpBB-forum til ren HTML, og jeg er ikke en racer på RegExp.
Og en skal ikke ta store dykket i RegExp før en skjønner hvorfor RegExp er TESTEN for en programmerer.
Men det skal heller ikke store dykket til for å løse så enkle oppgaver som phpBB2HTML.
Her er det du trenger for å løse enkle oppgaver i RegExp:
1. .* - matcher alle tegn
2. .*? - matcher alle tegn, men er ikke grådig, så den stopper ved første forekomst
3. (.*?) treffer det samme som .*? men forskjellen er at når du plasserer søket i () så kan du bruke treffet i strengen du skal erstatte med. Første forekomst av (.*?) tilsvarer $1 i resultat strengen.
4. \ - lar deg søke etter spesialtegn.
Eksempel:
Oppgaven er og konvertere:
[url=http://wikipedia.org]Wikipedia[/url]
til:
<a href="http://wikipedia.org">Wikipedia</a>
Løsning:
Regex.Pattern = "\[url\=(.*?)\](.*?)\[/url.*?\]"
str = Regex.Replace(str, "<a href=$1>$2</a>")
Forklaring:
\[url\= matcher [url=
så må vi ta vare på adressen:
(.*?) matcher "http://wikipedia.org" og tar vare på det som matcher i variablen $1
\] matcher første ]
(.*?) matcher Wikipedia og tar vare på det som matcher i variablen $2
\[/url.*?\] matcher [/url] .*? er tatt med pga at enkelte tager hadde en id i seg: [/url:9878998]
Hele strengen som matcher blir så erstattet med "<a href=$1>$2</a> der $1 = "http://wikipedia.org" og $2 = Wikipedia
Så slutt resultatet blir: <a href="http://wikipedia.org">Wikipedia</a>
Dette ble en veldig kort og overfladisk innføring i regulære uttrykk, men forhåpentlig nok til å fange interessen og inspirere til dypere dykk.
Snorkling i regexp: Microsofts korte innføring i VBA's RegExp
Dypdykking: regular-expressions.info
For lettere kunne teste ut dine regulære uttrykk så anbefaler jeg RegExTester eller Rubular
'VBA funksjonen slik den ble til slutt
Public Function phpBB2HTML(str) As String ' Konverter PHPBB kode til html-kode
'Sjekk om vi har innparameter
If IsNull(str) Then
FBB = ""
Exit Function
End If
Dim oRegExp As Object
Set Regex = CreateObject("VBScript.RegExp")
With Regex
.Global = True
.IgnoreCase = True
.MultiLine = True
End With
'[url]
Regex.Pattern = "\[url\](.*?)\[/url.*?\]"
str = Regex.Replace(str, "<a href=""$1"">$1</a>")
Regex.Pattern = "\[url\=(.*?)\](.*?)\[/url.*?\]"
str = Regex.Replace(str, "<a href=""$1"">$2</a>")
'[img]
Regex.Pattern = "\[img\](.*?)\[/img.*?\]"
str = Regex.Replace(str, "<img src=""$1"">")
'[size=15:987327837]
Regex.Pattern = "\[size\=(.*?):.*?\]"
str = Regex.Replace(str, "<span style=""font-size:$1px"">")
Regex.Pattern = "\[\/size.*?\]"
str = Regex.Replace(str, "</p></span>")
'[color=#FF0000]Red Text[/color]
Regex.Pattern = "\[color\=(.*?)\]"
str = Regex.Replace(str, "<span style=""color:$1"">")
Regex.Pattern = "\[\/color.*?\]"
str = Regex.Replace(str, "</p></span>")
'[quote]
Regex.Pattern = "\[quote.*?\]"
str = Regex.Replace(str, "<blockquote><p>")
Regex.Pattern = "\[\/quote.*?\]"
str = Regex.Replace(str, "</p></blockquote>")
'[code]
Regex.Pattern = "\[code.*?\]"
str = Regex.Replace(str, "<pre>")
Regex.Pattern = "\[\/code.*?\]"
str = Regex.Replace(str, "</pre>")
'[b]
Regex.Pattern = "\[b.*?\]"
str = Regex.Replace(str, "<b>")
Regex.Pattern = "\[\/b.*?\]"
str = Regex.Replace(str, "</b>")
'[i]
Regex.Pattern = "\[i.*?\]"
str = Regex.Replace(str, "<i>")
Regex.Pattern = "\[\/i.*?\]"
str = Regex.Replace(str, "</i>")
'[u]
Regex.Pattern = "\[u.*?\]"
str = Regex.Replace(str, "<u>")
Regex.Pattern = "\[\/u.*?\]"
str = Regex.Replace(str, "</u>")
'[list]
Regex.Pattern = "\[list.*?\]"
str = Regex.Replace(str, "")
Regex.Pattern = "\[\/list.*?\]"
str = Regex.Replace(str, "")
'linjeskift
str = Replace(str, vbCrLf, "<br>")
FBB = str
Set Regex = Nothing
End Function
Ett lite hint til slutt i forbindelse med phpBB konvertering, og det er at datoer blir i MySql lagret som sekunder etter 1970-01-01 00:00:00. Dvs for å få frem korrekt dato så må en bruke funksjonen DateAdd("s", dato, "1970-01-01 00:00:00")
Mvh
Ove B-) |