webForumDet fria alternativet

Kolla om pattern finns med regexp

ASP

21 svar · 420 visningar · startad av Addeladde

Medlem sedan jan. 20013 406 inlägg
Frågan#1

Har försökt med detta men regexp tillåter inte det

IF NOT objRegExp.EOF THEN
   response.write("det finns ett pattern")   
END IF
Medlem sedan apr. 20031 660 inlägg
#2

HEJ!

Att det inte fungerar förstår jag, du kan väl inte få End of File på ett RegExp?!

Prova http://www.devguru.com/Technologies/vbscript/quickref/RegExp.html, längst ned finns "Test Method".

Medlem sedan jan. 20013 406 inlägg
#3

Man kan ju få eof i en tabell det är ju inte riktigt heller en fil.

Medlem sedan apr. 20031 660 inlägg
#4

Hej!

Det kan du ju såklart få, men vad vill du egentligen göra, nu blev det ännu krångligare för mig att förstå vad du vill göra?

1. Loopa genom ett rs, köra RegExp på något värde, kontrollera om det passade?

2. Kontrollera om det finns ett värde tillagt till Regexp, dvs att det finns ett Pattern?

3. Något annat?

4. Eller du blev nöjd med svaret?!

Medlem sedan jan. 20013 406 inlägg
#5

Jag vill bara kolla ifall det hittar något pattern i så fall så ska den hämta en sak ur en tabell och sedan göra erättsningen.

Det är ju onödigt att hämta information som ska ersätta regexp patternet om det inte finns någon matchning.

Medlem sedan apr. 20031 660 inlägg
#6

HEJ!

Okej, lite av alt #1. Då ska du nog göra såhär:

pseudkod

if regexp.test then
  hämta ur tabell
  regexp.replace
end if

Fast, jag är inte med på varför, och på vad, du vill/ska testa först.
Vill du hämta olika data beroende på om uttrycket går igenom?

Medlem sedan jan. 20013 406 inlägg
#7

strSok = "bla bla bla ordsomskaersattas bal bla ba"
pseudkod

if not regexp = NULL then
  strReplace = 'hämtas från databasen
  regexp.replace
end if
Medlem sedan dec. 20003 887 inlägg
#8

Är det egenskapen Pattern i Regex, som ska vara en tom sträng?
Eller ska ett visst mönster inte ge några träffar på en given text?

1.
Set objRX = New RegExp

strSource = "..."
[blue]  .
  .
  .[/blue]
If objRX.Pattern = "" Then
  strReplace = Databas.GetPattern
  strSource = objRX.Replace(strSource, strReplace)
End If

2.
Set objRX = New RegExp

strSource = "..."

objRX.Pattern = "\w"

If objRX.Test(strSource) Then
  strReplace = Databas.GetPattern
  strSource = objRX.Replace(strSource, strReplace)
End If
Medlem sedan jan. 20013 406 inlägg
#9

Det är om ett visst pattern inte ger någon träff.

Medlem sedan dec. 20003 887 inlägg
#10

Då är det metoden Test() du ska använda

If Not objRegExp.Test([i]söksträng[/i]) Then
  [blue]'Mönstret gav noll träffar
  'hämta ett nytt mönster från databasen och testa igen...[/blue]
End If
Medlem sedan maj 200010 687 inlägg
#11

Addeladde skrev:

Man kan ju få eof i en tabell det är ju inte riktigt heller en fil.

Man får inte EOF på tabellen med t.ex. SQL utan det är ADO som har propertyn EOF. Att det sen heter EOF kan tyckas vara ologiskt, men jag tror ADO även kan användas för filer. Sen så kan man med file också mena register...

Medlem sedan jan. 20013 406 inlägg
#12

Har fått till det så här nu men jag skulle vilja få ut $1 till variabeln katalog. hur gör jag det?

<%

kod="test asddf sasdf asdf sdf f[blankettarkiv=testkatalog\kat]sdsf sddf sdf sdf sdfd "
'kod = "test asddfjsdadf sadsfdfjsdsdf sdsdjsdf sdsdfjsdfd sdffjsdsdf sdsf"
blankettarkivskod = "startkatalog = [katalog] "

Set objRegExp = New regexp
objRegExp.Global = true
objRegExp.IgnoreCase = true
objRegExp.Pattern = "\[blankettarkiv=(.+)\]"

IF objRegExp.test(kod) THEN
  
  katalog = ' Ska vara regexp objektet som står mellan (.+) alltså $1
	
  replacestring = objRegExp.Replace(kod, blankettarkivskod)
	
ELSE

  response.Write("Det finns inget pattern")

END IF

%>
Medlem sedan jan. 20032 285 inlägg
#13
IF objRegExp.test(kod) THEN
  Set objMatches = objRegExp.Execute(kod)

  For Each Match In Matches
    katalog = Mid(Match.Value, 16)
    katalog = Left(katalog, Len(katalog) - 1)
  Next

  Set objMatches = Nothing
  replacestring = objRegExp.Replace(kod, blankettarkivskod)	
ELSE
  response.Write("Det finns inget pattern")
END IF
Medlem sedan jan. 20013 406 inlägg
#14

Men om jag har två matchingar så får ju katalog det sista av matchingarna eller?

Medlem sedan jan. 20032 285 inlägg
#15

Om du lagrar det i en array då? :)

IF objRegExp.test(kod) THEN
  Dim arrKatalog()
  i = 0
  Set objMatches = objRegExp.Execute(kod)

  For Each Match In Matches
    ReDim Preserve arrKatalog(i)
    arrKatalog(i) = Mid(Match.Value, 16)
    arrKatalog(i) = Left(arrKatalog(i), Len(arrKatalog(i)) - 1)
    i = i + 1
  Next

  Set objMatches = Nothing
  replacestring = objRegExp.Replace(kod, blankettarkivskod)	
ELSE
  response.Write("Det finns inget pattern")
END IF
Medlem sedan jan. 20013 406 inlägg
#16

Det jag vill göra är att plocka ut katalog och sedan göra en ersättning i blankettarkivskod. Typ:

replace(blankettarkivskod(, "[katalog]" "$")

och sedan göra regexp replacen för varje objek.

replacestring = objRegExp.Replace(kod, blankettarkivskod)

Detta ska göras för varje pattern som hittas.
Det är för klurigt för att jag ska få till det i alla fall

Medlem sedan jan. 20032 285 inlägg
#17

Va, nu fattar jag inte riktigt? :q

Medlem sedan jan. 20013 406 inlägg
#18

Alltså om vi har en strkod som ser ut så här:

<html>
<title>Testsida</title>
</head>
<body>
Här står lite text
[blankettarkiv=testkat/underkat]
här står lite mer text
[blankettarkiv=testkat2]
</body>
</html>

Blankettarkivskoden ser ut så här:

<%
katalog = [katalog]

'diverse aspkod
%>

När man kört koden som vi försker få till så ska resultatet se ut så här:

<html>
<title>Testsida</title>
</head>
<body>
Här står lite text
<%
katalog = testkat/underkat

'diverse aspkod
%\>
här står lite mer text
\<%
katalog =  testkat2

'diverse aspkod
%\>

</body>
</html>

Klurigt klurigt :)

Medlem sedan jan. 20032 285 inlägg
#19

Typ så här kanske? Lite trött, så fel kan (kommer) förekomma. ;)

Dim arrKat()
i = 0

strKod = "<html>" &_
"<title>Testsida</title>" &_
"</head>" &_
"<body>" &_
"Här står lite text" &_
"[blankettarkiv=testkat/underkat]" &_
"här står lite mer text" &_
"[blankettarkiv=testkat2]" &_
"</body>" &_
"</html>"

strBlankett = "katalog = [katalog]" & vbCrLf & "'diverse aspkod"

Set RegExp = New Regexp
RegExp.IgnoreCase = True
RegExp.Global = True
RegExp.Pattern = "\[blankettarkiv=(.+)\]"
Set objMatches = RegExp.Execute(strKod)

For Each Match In objMatches
  ReDim Preserve arrKat(i)
  strKat = Mid(Match.Value, 16)
  strKat = Left(strKat, Len(strKat) - 1)
  arrKat(i) = strKat
  i = i + 1
Next

For j = 0 To UBound(arrKat)
  strTemp = Replace(Split(strBlankett, vbCrLf)(0), "[katalog]", arrKat(j))
  Response.Write(strTemp)
  Execute(Split(strBlankett, vbCrLf)(1))
Next

Set objMatches = Nothing : Set RegExp = Nothing

Det kommer bli svårt att göra det helt så dynamiskt som du tänker eftersom man bara kan köra Execute på ASP-kod, och om man använder en vanlig Response.Write() på koden skrivs den ut till webbläsaren och tolkas inte av servern.

Medlem sedan jan. 20013 406 inlägg
#20

Jag sparar koden i asp-fil så det är lugnt

265 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)