Jag håller på att konvertera en regexp-rutin som Henrik Malmberg skrev till pellesoft tidigare och är skrivet för en vb6-komponent. Nu är objekten ändrade lite i asp.net och regexpmotorn. Därför undrar jag om någon kan konvertera den kod som anges nedan till asp.net? Så här blev lösningen:Konvertera vb6 (regexp) till asp.net
<code>
Public Function ParseChatMsg(sText)
' används för såväl chatten som forumet
' skriven av Henkoz för pellesoft
Dim oRE, oMatches, oMatch
Dim sMatch, sURLValue, sEmail
Dim sType, nNum
Set oRE = New RegExp
oRE.Global = True
oRE.IgnoreCase = True
'** Leta
oRE.Pattern = "<url:(.*?)>"
'** Kort förklaring till ovanstående RegExp:
'** <url: följt av ngn sorts text och till slut >
'** < = <, > = >
Set oMatches = oRE.Execute(sText)
For Each oMatch In oMatches
sMatch = oMatch.Value
sURLValue = oMatch.SubMatches(0)
' urlnamn som visas
'if len(sURLValue) > 80 then
' a = instr(sURLValue ,"."): b = instr(a, sURLValue ,"/"): if b < a then b = a
' if b > 0 then urlnamn = left(sURLValue , b)
'else
urlnamn = sURLValue
'end if
If InStr(sURLValue, ":") = 0 Then
' sText = Replace(sText, sMatch, "" & sURLValue & "")
sText = Replace(sText, sMatch, "" & urlnamn & "")
Else
If Left(sURLValue, 7) = "mailto:" Then
sEmail = Right(sURLValue, Len(sURLValue) - 7)
sText = Replace(sText, sMatch, "" & sEmail & "")
Else
sText = Replace(sText, sMatch, "" & urlnamn & "")
End If
End If
Next
'** Leta faq, forum, tip å sånt :o)
oRE.Pattern = "!(forum|tip|faq|fil|link|user|artikel|q)([0-9]{1,})"
'** Kort förklaring till ovanstående RegExp:
'** ! följt av forum, tip, faq, fil eller link, följt av MINST en siffra, högsta antal inte satt..
Set oMatches = oRE.Execute(sText)
For Each oMatch In oMatches
sMatch = oMatch.Value
sType = oMatch.SubMatches(0)
nNum = oMatch.SubMatches(1)
'** Här ska alla de olika typerna skiljas åt..
Select Case LCase(sType)
Case "forum"
sText = Replace(sText, sMatch, "Inlägg:" & nNum & "")
Case "tip"
sText = Replace(sText, sMatch, "Tips & Tricks:" & nNum & "")
Case "faq"
sText = Replace(sText, sMatch, "FAQ:" & nNum & "")
Case "fil"
sText = Replace(sText, sMatch, "Filarkivet:" & nNum & "")
Case "link"
sText = Replace(sText, sMatch, "Länk:" & nNum & "")
Case "artikel"
sText = Replace(sText, sMatch, "Artikel:" & nNum & "")
Case "user"
sText = Replace(sText, sMatch, "Medlem:" & nNum & "")
Case "q"
Title = ReadTitle("http://support.microsoft.com/default.aspx?scid=kb;en-us;" & nNum, nNum)
sText = Replace(sText, sMatch, "" & Title & "")
End Select
Next
'** Cleaning up..
Set oMatches = Nothing
Set oRE = Nothing
'** Returnera..
ParseChatMsg = sText
End Function
</code>
Det finns två funktioner här som används och dessa är fixade. De heter ReadTitle samt GetHTML. Dessa kan ni ignorera för dessa är redan löst. Tack på förhand.
Hittade http://aspnet.4guysfromrolla.com/articles/022603-1.aspx som kanske kan vara lösningen på den andra regexp-varianten i koden ovan. Tyvärr är jag aldeles för dålig på regexp för att få till det - och det finns säkert fler av er som kan detta bra mycket bättre.Sv: Konvertera vb6 (regexp) till asp.net
<code>
Imports System.Text.RegularExpressions
Shared Function ParseChatMsg(ByVal sText As String) As String
' används för såväl chatten som forumet
' skriven av Henkoz för pellesoft
Dim oMatch
Dim sMatch, sURLValue, sEmail
Dim sType, nNum
Dim urlnamn
Dim title
' deklarationer
Dim m As Match
Dim sStr As String
'** Kort förklaring till ovanstående RegExp:
'** <url: följt av ngn sorts text och till slut >
'** < = <, > = >
'Dim r2 = New Regex("<url:(.*?)>", RegexOptions.IgnoreCase Or RegexOptions.Compiled)
Dim r2 = New Regex("(.*?)", RegexOptions.IgnoreCase Or RegexOptions.Compiled)
m = r2.Match(sText)
While m.Success
sURLValue = m.Groups(1).Value
urlnamn = sURLValue
sStr = m.Groups(1).Index.ToString()
sMatch = "" & sURLValue & ""
If InStr(sURLValue, ":") = 0 Then
sText = Replace(sText, sMatch, "" & urlnamn & "")
Else
If Left(sURLValue, 7) = "mailto:" Then
sEmail = Right(sURLValue, Len(sURLValue) - 7)
sText = Replace(sText, sMatch, "" & sEmail & "")
Else
sText = Replace(sText, sMatch, "" & urlnamn & "")
End If
End If
' loopa nästa förekomst
m = m.NextMatch()
End While
'** Leta faq, forum, tip å sånt
' -----------------------------------------
r2 = New Regex("!(forum|tip|faq|fil|link|user|artikel|q)([0-9]{1,})", RegexOptions.IgnoreCase Or RegexOptions.Compiled)
m = r2.Match(sText)
While m.Success
sType = m.Groups(1).Value
nNum = m.Groups(2).Value
sStr = "!" & sType & nNum ' strängen vi skall ersätta
Select Case LCase(sType)
Case "forum"
sText = Replace(sText, sStr, "Inlägg:" & nNum & "")
Case "tip"
sText = Replace(sText, sStr, "Tips & Tricks:" & nNum & "")
Case "faq"
sText = Replace(sText, sStr, "FAQ:" & nNum & "")
Case "fil"
sText = Replace(sText, sStr, "Filarkivet:" & nNum & "")
Case "link"
sText = Replace(sText, sStr, "Länk:" & nNum & "")
Case "artikel"
sText = Replace(sText, sStr, "Artikel:" & nNum & "")
Case "user"
sText = Replace(sText, sStr, "Medlem:" & nNum & "")
Case "q"
title = ReadTitle("http://support.microsoft.com/default.aspx?scid=kb;en-us;" & nNum, nNum)
sText = Replace(sText, sStr, "" & title & "")
End Select
' m.Groups(1).Value & " at " & m.Groups(1).Index.ToString())
m = m.NextMatch()
End While
r2 = Nothing
m = Nothing
'-- Returnera den nya strängen med ersatta länkar o.dyl
ParseChatMsg = sText
End Function
</code>