webForumDet fria alternativet

Asp-Parser och RegExp

ASP

18 svar · 521 visningar · startad av MickeA.com

Medlem sedan feb. 20034 441 inlägg
Frågan#1

Tja!
Har tagit hem en Aspparser med färgläggning från Pellesoft. Nu skulle jag vilja få igång en funktion utifrån ett RegExp.

objRE.Pattern = "\[kod\]"
str = objRE.Replace(str,"<blockquote><span class=""kod""><font size='1'>Kod:</font><hr /><font face='arial' size='2'>")

objRE.Pattern = "\[/kod\]"
str = objRE.Replace(str,"</font><hr /></span></blockquote>")

Sådär ser det ut, fast den där spec. formaterar det som omsluts av [ kod] [ /kod].
Nu vill jag alltså göra samma sak, fast med [ asp] [ /asp], fast när min funktion ovan går igenom den, ska en funktion kallas:

colorcode(str, "font", "size")

Hur ska jag bära mig åt? Det jag provar funkar inte alls.

Tack!

Medlem sedan feb. 20034 441 inlägg
#2

Ingen som vet svaret eller har ngra tips på hur jag ska lösa det här?
Kanske en bra länk, eller några bra sökord som jag kan ha användning av?

Medlem sedan dec. 20025 483 inlägg
#3

Kan du visa exempel på vad du har provat? Hur ser definitionen av colorcode() ut?

:)

Medlem sedan feb. 20034 441 inlägg
#4

Tja!
Skickar med hela filen istället, det är helt enkelt en .inc fil som man inkluderar i dok.

Det här är ett exempel på hur man "kör igång" funktionen:

colorCode(str, "tahoma", "1")

Jag vill alltså att allt som hamnar inom [asp][/asp] ska "formateras" utifrån det som finns i "colorcode.inc". Jag vet inte alls om man kan lösa det med RegExp, eller om man måste ta till några andra knep.
Kom på en annan grejj, högst upp i colorcode.inc "deklareras" alla ord som ska färgas: (liten del utan det)

Const Keyword3 = "*Session*Application*Response*Request*QueryString*Form*Write*Session*Buffer*Cookies*Delete*Command*Click*Cookies*Application*Alert*Script*Language*JavaScript*UnLock*ServerVariables*"

Hur ska jag göra om jag vill ha IgnoreCase på dom? Det funkar ju nämligen inte att tex. skicka in if till funktionen, för då blir det inte rätt, man måste skriva sin kod "rätt" (If) för att den skall färgas.

Tack Tack!

Medlem sedan dec. 20025 483 inlägg
#5

Jag är ingen VBScript-guru, men kan följande fungera?:

dim str2
objRE.pattern = "\[asp\]((.|\n)*)\[/asp\]"

if objRE.test(str) then
    str2 = "<blockquote><span class=""kod""><font size='1'>Kod:</font><hr /><font face='arial' size='2'>"
    str2 = str2 & colorcode(objRE.replace(str, "$1"), "tahoma", "1")
    str2 = str2 & "</font><hr /></span></blockquote>"
end if

För att få en ignorecase-effekt kan du modifiera ColorWord() och konstanterna litet grand:

Keyword1 = lcase("*vbCrLf*Abs*Add*AddItem*AppActivate*Array*Asc*Atn*Beep*Begin*BeginProperty*ChDir*ChDrive*Choose*Chr*Clear*Collection*Command*Cos*CreateObject*CurDir*DateAdd*DateDiff*DatePart*DateSerial*DateValue*Day*DDB*DeleteSetting*Dir*DoEvents*EndProperty*Environ*EOF*Err*Exp*FileAttr*FileCopy*FileDateTime*FileLen*Fix*Format*FV*GetAllSettings*GetAttr*GetObject*GetSetting*Hex*Hide*Hour*InputBox*InStr*Int*Int*IPmt*IRR*IsArray*IsDate*IsEmpty*IsError*IsMissing*IsNull*IsNumeric*IsObject*Item*Kill*LCase*Left*Len*Load*Loc*LOF*Log*LTrim*Me*Mid*Minute*MIRR*MkDir*Month*Now*NPer*NPV*Oct*Pmt*PPmt*PV*QBColor*Raise*Randomize*Rate*Remove*RemoveItem*Reset*RGB*Right*RmDir*Rnd*RTrim*SaveSetting*Second*SendKeys*SetAttr*Sgn*Shell*Sin*Sin*SLN*Space*Sqr*Str*StrComp*StrConv*Switch*SYD*Tan*Text*Time*Time*Timer*TimeSerial*TimeValue*Trim*TypeName*UCase*Unload*Val*VarType*WeekDay*Width*Year*Replace*Split*Imports*Module*Console*")
Keyword2 = lcase("*#Const*#Else*#ElseIf*#End If*#If*Alias*Alias*And*As*Base*Binary*Boolean*Byte*ByVal*Call*Case*CBool*CByte*CCur*CDate*CDbl*CDec*CInt*CLng*Close*Compare*Const*CSng*CStr*Currency*CVar*CVErr*Decimal*Declare*DefBool*DefByte*DefCur*DefDate*DefDbl*DefDec*DefInt*DefLng*DefObj*DefSng*DefStr*DefVar*Dim*Do*Until*Double*Each*Else*ElseIf*End*Enum*Eqv*Erase*Error*Exit*Explicit*False*For*Function*Get*Global*GoSub*GoTo*If*Imp*In*Input*Input*Integer*Is*LBound*Let*Lib*Like*Line*Lock*Long*Loop*LSet*Name*New*Next*Not*Object*On*Open*Option*Or*Output*Print*Private*Property*Public*Put*Random*Read*ReDim*Resume*Return*RSet*Seek*Select*Set*Single*Spc*Static*String*Stop*Sub*Tab*Then*Then*True*Type*UBound*Unlock*Variant*Wend*While*With*Xor*Nothing*To*Debug*Try*Catch*")
Keyword3 = lcase("*Session*Application*Response*Request*QueryString*Form*Write*Session*Buffer*Cookies*Delete*Command*Click*Cookies*Application*Alert*Script*Language*JavaScript*UnLock*ServerVariables*")

Private Function ColorWord(s) 
    'Kontrollera om ordet är ett Keyword
    'Färga om det är det
    
    'Keyword 1
    If InStr(1, Keyword2, "*" + lcase(s) + "*") Then
        ColorWord = "<font color=" + Chr(34) + ResColor2 + Chr(34) + ">" + s + "</font>"
    ElseIf InStr(1, Keyword3, "*" + lcase(s) + "*") Then
        ColorWord = "<font color=" + Chr(34) + ResColor3 + Chr(34) + ">" + s + "</font>"
    Else
        If InStr(1, Keyword1, "*" + lcase(s) + "*") Then
            ColorWord = "<font color=" + Chr(34) + ResColor1 + Chr(34) + ">" + s + "</font>"
        Else
            'Inte ett Keyword
            ColorWord = s
        End If
    End If
End Function

Som du ser har jag använt lcase() på (de forna) konstanterna, vilket inte är helt optimalt. Istället kan du definiera dessa konstanter till att enbart innehålla gemener, typ:

const keyword 1 = "*vbcrlf*...*console*"

:)

Medlem sedan feb. 20034 441 inlägg
#6

Nämen det här ser lysande ut, jag ska prova på dirren. Det här med lCase() har jag redan tänkt på, men som du säger är det inte fullt optimalt.

Tänkte tanken redan i början att skriva om allt med små bokstäver och sen köra en lCase på det som finns inom [asp][/asp], men det är ju så jobbigt att skriva om ;)

Tack så mycket!

Medlem sedan feb. 20034 441 inlägg
#7

Hmm, det funkar inte så bra, tyvärr.
Något blir fel, för det skrivs bara ut ett enda inlägg när jag kör koden, det är eg. fem st i den tråden jag ska prova det här på.

Så det är ngt fel på:

dim str2
objRE.pattern = "\[asp\]((.|\n)*)\[/asp\]"

if objRE.test(str) then
    str2 = "<blockquote><span class=""kod""><font size='1'>Asp:</font><hr /><font face='arial' size='2'>"
    str2 = str2 & colorcode(objRE.replace(str, "$1"), "tahoma", "1")
    str2 = str2 & "</font><hr /></span></blockquote>"
end if

Men vad?

Nu är det här nära en lösning, så jag skulle bli kanonglad om det här sista gick att lösa.

Tack!

Medlem sedan feb. 20034 441 inlägg
#8

Löste problemet delvis.
Lade till str = str2 efter end if.

Då hoppade färgläggningen igång, vilket är kanon.
Problemet kvarstår dock att alla underliggande inlägg inte skrivs ut.

Så något i pattern är fortf. fel.

Medlem sedan dec. 20025 483 inlägg
#9

Hur kan en sträng som skall parsas se ut?

Edit: Testa följande:

if objRE.test(str) then
str = objRE.replace(str, 
	"<blockquote><span class=""kod""><font size='1'>Kod:</font><hr /><font face='arial' size='2'>" & _
	colorcode(objRE.replace(str, "$1"), "tahoma", "1") & _
	"</font><hr /></span></blockquote>")
end if

:)

Medlem sedan feb. 20034 441 inlägg
#10

Hmm, fortf. samma grej.
Koden blir färgad, men efter ett inlägg som innehåller [asp][/asp] skrivs inget mer ut.

http://mickea.dyndns.org/_Asp/forum_v2.00/default.asp?mP=showthread&tId=16&fId=1

Sen blir resultatet jättekonstigt. Inäggen verkar htmlencode'as, för trots str = Replace(str, VbCrLf,"<br>")
blir det inga radbrytningar i inläggen.

Kanske ska ta och struna i det här helt och hållet, eller går det att lösa på nått smidigt sätt?

Kan skicka med det övriga som finns i den här funktionen för forumkod, som jag från början fått av söderlund:

Function FCode(str)

'str = Replace(str,"<","&lt;")
'str = Replace(str,VbCrLf,"<br />")

Set objRE = New regexp
objRE.Global = true
objRE.IgnoreCase = true

'start citering
objRE.Pattern = "\[citat=(.*?)](\w\s)*"
str = objRE.Replace(str,"<br />[citat=$1]")

objRE.Pattern = "\[citat=(.*?)]"
str = objRE.Replace(str,"<blockquote><b>$1</b> säger:<hr /><span class=""citat"">")

objRE.Pattern = "\[citat\](\w[åäö]*\s[åäö]*)*"
str = objRE.Replace(str,"<blockquote><br /><span class=""cit""><font size='1'>Citat:</font></span><hr /><i><span class=""citat"">$1")

objRE.Pattern = "\[/citat\]"
str = objRE.Replace(str,"</span></i><hr /></blockquote>")
'slut citering

objRE.pattern = "\[asp\]((.|\n)*)\[/asp\]"
if objRE.test(str) then
str =		objRE.replace(str, "<blockquote><span class=""kod""><font size='1'>Kod:</font><hr /><font face='arial' size='2'>" & _
			colorcode(objRE.replace(str, "$1"), "tahoma", "1") & _
			"</font><hr /></span></blockquote>")
end if

'dim str2
'objRE.pattern = "\[asp\]((.|\n)*)\[/asp\]"
'colorCode(str, "tahoma", "1")
'str2 = "<blockquote><span class=""kod""><font size='1'>Asp:</font><hr /><font face='arial' size='2'>"
'str2 = str2 & colorcode(objRE.replace(str, "$1"), "tahoma", "1")
'str2 = str2 & "</font><hr /></span></blockquote>"
'str = str2

'start kod
objRE.Pattern = "\[kod\]"
str = objRE.Replace(str,"<blockquote><span class=""kod""><font size='1'>Kod:</font><hr /><font face='arial' size='2'>")

objRE.Pattern = "\[/kod\]"
str = objRE.Replace(str,"</font><hr /></span></blockquote>")
'slut kod

objRE.Pattern = "\[img\](.*)\[/img\]"
str = objRE.Replace(str, "<img src=""$1"" style=""border: 0px;"">")

objRE.Pattern = "\[(b|/b|i|/i|u|/u)\]"
str = objRE.Replace(str,"<$1>")

'fixa länkar och e-postadresser
'objRE.Pattern = "([url]www.[/url][^ ]*[a-z])|([url]http://[/url][^ ]*[a-z])"
'str = objRE.Replace(str,"<a href=""$1$2"" target=""_blank"">$1$2</a>")

'buggfixningar
'str = Replace(str,"""www","""http://www")
'str = Replace(str,"""http://www""","""www""")

'str = Replace(str,"<br""","""")
'str = Replace(str,"<br</a> />","</a><br />")

'str = Replace(str,"</span><hr""","""")
'str = Replace(str,"</span><hr</a> />","</a></span><hr />")

'str = Replace(str,"<blockquote><span""","""")
'str = Replace(str,"<blockquote><span</a>","</a><span")
'str = Replace(str,"</b</a>>","</b>")
'slut
'objRE.Pattern = "([\w~\-\.]+@[\w~\-\.]+[a-z])"
'str = objRE.Replace(str,"<a href=""mailto:$1"">$1</a>")
'slut länkar och e-postadresser

objRE.Pattern = "\[url=(.*)\](.*)\[/url\]"
str = objRE.Replace(str, "<a href=""$1"">$2</a>")

objRE.Pattern = "\[email=(.*)\](.*)\[/email\]"
str = objRE.Replace(str, "<a href=""mailto:$1"">$2</a>")
Set objRE = Nothing

str = Replace(str, VbCrLf,"<br>")

Fcode = str
End Function
'slut

Tack!

Medlem sedan dec. 20025 483 inlägg
#11

Då testar vi igen:

objRE.pattern = "\[asp\]((.|\n)*)\[/asp\]"
str = objRE.replace(str, "[asp]" & colorcode(objRE.replace(str, "$1"), "tahoma", "1") & "[/asp]")

objRE.pattern = "\[asp\]"
str = objRE.replace(str, "<blockquote><span class=""kod""><font size='1'>Asp:</font><hr /><font face='arial' size='2'>")

objRE.pattern = "\[/asp\]"
str = objRE.replace(str, "</font><hr /></span></blockquote>")
Medlem sedan feb. 20034 441 inlägg
#12

Tyvärr, fortf samma grej.
I de inlägg som innehåller [asp] stannar utskriften helt oh chållet, inga fler inlöägg i akt. tråd skrivs ut.

Damn va konstigt.
Hur funkar tex. php parsern här på wF?

Medlem sedan juli 20041 183 inlägg
#13

kan tyvärr inte hjälpa dig, men...

finns det något fungeramde exempel tillgänligt för att kunna se hur resulatet kan se ut?

Jag använder mig idag av Replace() för att byta ut kod-ord mot <span class="">kod-ord</span>. Jag tycker det fungerar bra :) Någon som vill skälla på mig och säga att det inte gör det?

Se resultatet här

...och jag vet att den koden som visas inte stämmer helt... Jag byter ut flera ord mot Server när det istälelt ska vara något annat.

Medlem sedan dec. 20025 483 inlägg
#14

Skrivs alla inlägg ut om du tar bort de koddelar som skall transformera [asp]-sektioner?

Annars tycker jag mitt senaste förslag bör fungera, d v s:

...
objRE.Pattern = "\[/citat\]"
str = objRE.Replace(str,"</span></i><hr /></blockquote>")
'slut citering

[b]objRE.pattern = "\[asp\]((.|\n)*)\[/asp\]"
str = objRE.replace(str, "[asp]" & colorcode(objRE.replace(str, "$1"), "tahoma", "1") & "[/asp]")

objRE.pattern = "\[asp\]"
str = objRE.replace(str, "<blockquote><span class=""kod""><font size='1'>Asp:</font><hr /><font face='arial' size='2'>")

objRE.pattern = "\[/asp\]"
str = objRE.replace(str, "</font><hr /></span></blockquote>")[/b]

'start kod
objRE.Pattern = "\[kod\]"
...

:)

Medlem sedan feb. 20034 441 inlägg
#15

lilja skrev:

finns det något fungeramde exempel tillgänligt för att kunna se hur resulatet kan se ut?

Ladda hem colorcode.inc ovan, inkludera den i en fil och kör tex.:

str = "<% if blahh = "balahablähää" Then Server.Execute('bbb.inc') End If %>"
colocode(str, "courier", "1")

lilja skrev:

Jag använder mig idag av Replace() för att byta ut kod-ord mot <span class="">kod-ord</span>. Jag tycker det fungerar bra :)

Men hur ska jag köra för att trycka in det där i en RegExp då? För det är ju bara det som finns mellan [asp] och [/asp] som ska färgas om.
Men det måste ju finnas nån guru på det här forumet som vet hur jag ska lösa mitt problem?

Medlem sedan juli 20041 183 inlägg
#16

kanske :)

Set objRegExp = New regexp
objRegExp.Global = true
objRegExp.IgnoreCase = true
objRegExp.Pattern = "[ASP].*[/ASP]"
Set tASPCode= objRegExp.Execute(strHTML)
Set objRegExp = Nothing

tASPCode(0) = Replace(tASPCode(0),"Server","<kod för vald färg>Server<avsluta vald färg>")
osv...

haha, ja vet... Jag är inte särskillt duktigt, men chansen finns att jag snuddar vid något viktigt och någon mer duktig kan fortsätta med ett mer correkt svar...

för det funkar väl inte? eller? jag använda ett liknande skript för att hämta nyheter ifrån en RSS-feeder så det är ju inte direkt samma applikations-typ...

Medlem sedan feb. 20034 441 inlägg
#17

Peter S skrev:

Skrivs alla inlägg ut om du tar bort de koddelar som skall transformera [asp]-sektioner?

Japps, kommenterar jag bort de sex raderns då skrivs allt ut, men så fort jag väljer att änvända de raderna i mitt RegExp så skriver den bara ut ett inlägg / tråd.

Medlem sedan juli 20041 183 inlägg
#18

Hmm, kanske skulle jag skriva i en ny tråd men ni får skälla på mig i sådana fall... Det är ju samma script...

Jag laddade ner colorcoder och försökte få den att fungera i mitt script, men hur ska jag göra?:

strText = objRs("mKod")
		
strText = colorCode(strText, "courier", "1")
Response.Write(strText)

Jag får detta meddelandet

Microsoft VBScript runtime error '800a01f5' 

Illegal assignment: 'i' 

/layout_05/test/parser/colorcode.inc, line 88
Medlem sedan feb. 20034 441 inlägg
#19

Ett första knep är ju att tala om vad som finns på rad 88 i colorcode.inc.
Nu har ju jag den själv och när jag kollar står det:

 i = 1

Det här kan alltså bero på att du redan använder 'i' i din loop, så det helt sonika blir en krock där.

Det är det enda jag kan komma på, eftersom filen i sig funkar hur bra som helst här.
Kan du klistra in hela din kod här, eller PM'a den till mig om du inte vill visa den för alla? ;)

260 ms totalt · 4 externa anrop · v20260731065814-full.e96017d9
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)
121 ms — ändringar (db)