Avatar billede roadrunr Nybegynder
10. oktober 2000 - 09:22 Der er 33 kommentarer og
1 løsning

Fjerne bestemte <tags> i streng

Jeg har en lang streng som indeholder både HTML-kode og tekst.

--------------
<table><tr><td>min tekst</td></tr></table>
<br>en masse tekst som er ligegyldigt<?xml property=tilfældig>asddsa<o:p></o:p>sluttekst.
--------------

Jeg skal hertil bruge et lille script, som kan søge strengen igennem, og fjerne alle  <?xml> og alle de properties der står mellem \"<\" og \">\" i xml tagget. På samme måde skal den også fjerne alle <o:p> og </o:p>.
Jeg skal bruge en form for løkke, som søger hele strengen igennem. Hver gang den finder et \"<\" skal den gennemgå en \"If-Then-Else\", hvor den checker om tagget er et <?xml>. eller et <o:p> o.s.v.
Når et <tag> er blevet fjernet, skal den køre løkken på NY og, og starte hvor den slap.

Hvis der er en nemmere måde, vil det selvfølgelig også have interesse.

På forhånd tak

/Martin
Avatar billede jw Nybegynder
10. oktober 2000 - 09:24 #1
Med på en lytter...
/jw
Avatar billede larsk Nybegynder
10. oktober 2000 - 09:47 #2
Hej

Prøv lige med denne her lille fjerne funktion. Giv den din tekst streng, og den tag du skal have fjernet. Har ikke prøvet den selv....

function fjern(str,tag)
  start = 0
  slut = 0
  for i = 1 to len(str)
    if mid(str,1,len(tag)) = tag then
      str = mid(str,1,i-1) & mid(str,i+len(tag),len(str))
    end if
  next i
  fjern = str
end function
Avatar billede larsk Nybegynder
10. oktober 2000 - 09:52 #3
Ups der manglede lige et +
function fjern(str,tag)
  start = 0
  slut = 0
  for i = 1 to len(str)
    if mid(str,1,len(tag)) = tag then
      str = mid(str,1,i-1) & mid(str,i+len(tag)+1,len(str))
    end if
  next i
  fjern = str
end function
Avatar billede roadrunr Nybegynder
10. oktober 2000 - 10:09 #4
Problemet er bare at len(<tagget>) ikke altid er kendt. f.eks. kan man have et <span> tag som ser ud som følgende:

<span style=color:blue\">

og et andet

<span style=\"color:blue; font-size:8pt\">

og så går det ikke rigtig med at sammenligne længden. I stedet skal man først finde \"<\" og dernæst \">\" og så se om tagget man ikke ønsker er der imellem.
Avatar billede sone Nybegynder
10. oktober 2000 - 10:12 #5
Find start-positionen af del-strengen \"<?xml\" (x) og find positionen for næste > (y).
Erstat strengen fra pos. x-y med \"\".

<o:p>: streng = Replace(streng, \"<o:p>\", \"\") og streng = Replace(streng, \"</o:p>\", \"\")
Avatar billede stringbuffer Nybegynder
10. oktober 2000 - 10:17 #6
Det er nemmest at gøre det i JScript med lidt RegExp gymnastik:

<SCRIPT RUNAT=SERVER LANGUAGE=JScript>
function killXML(myString)
{
re1 = /\\x3c\\?xml[\\w\\W]*\\x3e/gi
re2 = /\\x3c.?o\\:p[\\w\\W]*\\x3e/gi
myString = myString.replace(re1,\"\")
myString = myString.replace(re2,\"\")
return myString
}
</SCRIPT>

mere skal der ikke til - har testet det :-)
Avatar billede stringbuffer Nybegynder
10. oktober 2000 - 10:22 #7
Du kan bare indsætte ovenstående i dit ASP-dokument f.eks. i slutningen...
<%
\'din kode her
.
.
.
.
%>
<SCRIPT RUNAT=SERVER LANGUAGE=JScript>
function killXML(myString)
{
re1 = /\\x3c\\?xml[\\w\\W]*\\x3e/gi
re2 = /\\x3c.?o\\:p[\\w\\W]*\\x3e/gi
myString = myString.replace(re1,\"\")
myString = myString.replace(re2,\"\")
return myString
}
</SCRIPT>
Avatar billede roadrunr Nybegynder
10. oktober 2000 - 10:24 #8
sone: lyder meget fornuftigt, men så mangler jeg den rigtige løkke som kører strengen igennem.

stringbuffer: Nu så jeg gerne at det blev gjort i vbscript, og samtidig skulle det også gerne være sådan så at man i \"if-then-else\" sætningen med tiden skal kunne tilføje nye tags, som man gerne vil have erstattet.
Avatar billede sone Nybegynder
10. oktober 2000 - 10:35 #9
FUNCTION stripTag(str, tagname)
  DIM startpos, endpos
  startpos = 1
  DO WHILE startpos>0
    startpos = InStr(1, str, \"<\"&tagname, 1)
    IF startpos>0 THEN
        endpos = InStr(startpos+1, str, \">\", 1)
        test = Replace(str, Mid(test, startpos, endpos-startpos), \"\")
    END IF
  LOOP
END FUNCTION

test=\"123<?xml iddiuf >456<?xml bla bla >789\"
test = stripTag(temp, \"?xml\")
Avatar billede roadrunr Nybegynder
10. oktober 2000 - 10:46 #10
sone: det lader til at virke fint. Hvordan kan det være at du i \"stripTag(temp, \"?xml\")\" skriver \"temp\" og ikke \"test\", som er den streng man vil gennemsøge?
Avatar billede roadrunr Nybegynder
10. oktober 2000 - 11:15 #11
Hvis jeg så også skulle er statte tagget \"<o:p>\", hvad skal jeg så tilføje?
F.eks:
test = stripTag(test, \"o:p\")???
Avatar billede sone Nybegynder
10. oktober 2000 - 11:18 #12
En lille rettelse:

FUNCTION stripTag(str, tagname)
  DIM startpos, endpos
  startpos = 1
  DO WHILE startpos>0
    startpos = InStr(1, str, \"<\"&tagname, 1)
    Response.Write(startpos & \"<BR>\")
    IF startpos>0 THEN
        endpos = InStr(startpos+1, str, \">\", 1)
        str = Replace(str, Mid(str, startpos, endpos-startpos+1), \"\")
    END IF
  LOOP
  stripTag = str
END FUNCTION

Reelt er test = stripTag(test, \"o\") nok
Avatar billede roadrunr Nybegynder
10. oktober 2000 - 11:23 #13
Ja okay.... men hvordan tilføjer jeg linien til resten af scripet. Skal jeg bare placere den under
test = stripTag(temp, \"?xml\")

altså ala:
--------------------------------------------------------------------------
FUNCTION stripTag(str, tagname)
  DIM startpos, endpos
  startpos = 1
  DO WHILE startpos>0
    startpos = InStr(1, str, \"<\"&tagname, 1)
    Response.Write(startpos & \"<BR>\")
    IF startpos>0 THEN
        endpos = InStr(startpos+1, str, \">\", 1)
        str = Replace(str, Mid(str, startpos, endpos-startpos+1), \"\")
    END IF
  LOOP
  stripTag = str
END FUNCTION

test = \"123<?xml iddiuf >456<?xml bla bla >789\"

test = stripTag(test, \"?xml\")
test = stripTag(test, \"o:p\")
test = stripTag(test, \"font\")
test = stripTag(test, \"p\")
test = stripTag(test, \"span\")
-----------------------------------------------------------------------------
Jeg kan nemmelig ikke få det til at virke på denne måde!
Avatar billede sone Nybegynder
10. oktober 2000 - 11:25 #14
test = stripTag(temp, \"?xml\") skal selvfølgelig være
test = stripTag(test, \"?xml\")
Avatar billede roadrunr Nybegynder
10. oktober 2000 - 11:31 #15
hvad med mit sidste spg - kan det løses?
Avatar billede sone Nybegynder
10. oktober 2000 - 11:34 #16
En variabel indeholder den tekst hvor du gerne vilo have fjernet noget i (kaldet test i min demo).
Efter et antal kald til stripTag kan du bruge variablen som du plejer - nu uden diverse tags.
Avatar billede roadrunr Nybegynder
10. oktober 2000 - 11:44 #17
okay - men hvordan laver jeg flere kald til funktionen. Fordi mit ovenstående eksempel virker i hvert fald ikke :(
Avatar billede sone Nybegynder
10. oktober 2000 - 11:47 #18
Nå... vis mig lige den kode som \"burde\" virke
Avatar billede roadrunr Nybegynder
10. oktober 2000 - 11:54 #19
Function stripTag(str, tagname, replacement)
    DIM startpos, endpos
    startpos = 1
   
    Do While startpos > 0
        startpos = InStr(1, str, \"<\" & tagname, 1)
        If startpos > 0 Then
            endpos = InStr(startpos+1, str, \">\", 1) + 1
            test = Replace(str, Mid(test, startpos, endpos-startpos), replacement)
        End If
    Loop
    Response.Write test
End Function
       
test = \"123<?xml iddiuf>456<o:p>789\"
test = stripTag(test, \"?xml\", \"\")
test = stripTag(test, \"o:p\", \"\")   
Avatar billede sone Nybegynder
10. oktober 2000 - 12:09 #20
...funktionen returnerer jo ikke noget - det har du jo fjernet!
Avatar billede roadrunr Nybegynder
10. oktober 2000 - 12:12 #21
Hehe.. HOVSA! :)
Avatar billede roadrunr Nybegynder
10. oktober 2000 - 12:24 #22
hvad gør jeg forkert??
---------------------------------------------------------------
Function stripTag(str, tagname, replacement)
    DIM startpos, endpos
    startpos = 1
   
    Do While startpos > 0
        startpos = InStr(1, str, \"<\" & tagname, 1)
        If startpos > 0 Then
            endpos = InStr(startpos+1, str, \">\", 1) + 1
            str = Replace(str, Mid(str, startpos, endpos-startpos), replacement)
        End If
    Loop
    nystr = str
End Function

test = \"123<?xml iddiuf>456<o:p>789\"
test = stripTag(test, \"?xml\", \"\")
test = stripTag(nystr, \"o:p\", \"\")   

Response.Write test
---------------------------------------------------------------
Avatar billede sone Nybegynder
10. oktober 2000 - 12:25 #23
Når du skal returnere noget fra en funktion, så SKAL du bruge funktionanavnet:

stripTag = str
Avatar billede roadrunr Nybegynder
10. oktober 2000 - 12:34 #24
Så fejlmelder den med at den mangler \"argumenter\"... kan du ikke lige selv prøve at teste det?
Avatar billede sone Nybegynder
10. oktober 2000 - 12:46 #25
Følgende virker fint:

Function stripTag(str, tagname, replacement)
    DIM startpos, endpos
    startpos = 1
   
    Do While startpos > 0
        startpos = InStr(1, str, \"<\" & tagname, 1)
        If startpos > 0 Then
            endpos = InStr(startpos+1, str, \">\", 1) + 1
            str = Replace(str, Mid(str, startpos, endpos-startpos), replacement)
        End If
    Loop
  stripTag = str
END FUNCTION
Avatar billede roadrunr Nybegynder
10. oktober 2000 - 12:54 #26
jaja - det er såmen godt nok. men det er den har del jeg ikke kan finde ud af:
----------

test = \"123<?xml iddiuf>456<o:p>789\"
test = stripTag(test, \"?xml\", \"\")
test = stripTag(nystr, \"o:p\", \"\")   

Response.Write test

----------
altså hvordan man tilføjer flere \"erstatninger\", og hvordan man til sidst skriver dem ud!
Avatar billede sone Nybegynder
10. oktober 2000 - 12:58 #27
test = \"123<?xml iddiuf>456<o:p>789\"
\'test indeholder nu: \"123<?xml iddiuf>456<o:p>789\"

test = stripTag(test, \"?xml\", \"\")
\'test indeholder nu: \"123456<o:p>789\"

test = stripTag(test, \"o:p\", \"\")
\'test indeholder nu: \"123456789\"
Avatar billede stringbuffer Nybegynder
13. oktober 2000 - 14:34 #28
Her er løsningen:

<%
Function KillTag(myString, myTag, myReplacement)
  Dim regEx1, regEx2
  Set regEx1 = New RegExp
  Set regEx2 = New RegExp
  regEx1.Pattern = \"([\\+|\\?|\\\'|\\{|\\}|\\.|\\(|\\)|\\,|\\*|\\^|\\$|\\[|\\]|\\\\])\"
  regEx1.Global = True               
  regEx2.IgnoreCase = True
  regEx2.Global = True   
  myTag = regEx1.Replace(myTag, \"\\$1\") \'erstat speciele tegn med deres escape-tegn   
  regEx2.Pattern = \"\\x3c\" & myTag & \"[^\\x3e]*\\x3e\"
KillTag = regEx2.Replace(myString, myReplacement)   
End Function

myTestStr = \"Tester... <\\?xml nogle=\'properties\' her> eller <o:p>, eller <\\o:p>, en <?XML> eller måske lidt <?xml med noget puha>\"
myNewStr = KillTag(myTestStr,\"?xml\",\"XML-tag\")
myNewStr = KillTag(myNewStr,\"\\o:p\",\"grim OP-tag\")
myNewStr = KillTag(myNewStr,\"o:p\",\"OP-tag\")
myNewStr = KillTag(myNewStr,\"\\?xml\",\"grim XML-tag\")
%>
Her er testStrengen:<br>
<%= Server.HTMLEncode(myTestStr) %><br>
Her er den behandlede streng:<br>
<%= Server.HTMLEncode(myNewStr) %><br>

Den er testet, kan jeg få mine point nu, tak
Avatar billede roadrunr Nybegynder
23. oktober 2000 - 12:57 #29
stringbuffer: nu skulle du jo gerne være i asp!(altså noget jeg selv kan gennemskue) :)
Avatar billede stringbuffer Nybegynder
24. oktober 2000 - 09:16 #30
Hallo?!?!?!?
Hvad fanden vil du så kalde det, hvis du ikke kalder det ASP???????
Avatar billede roadrunr Nybegynder
09. november 2000 - 13:21 #31
Okay.... det er nok bare mig som ikke er god nok til at forstå.
kan du så forklare denne kode - fordi den fatter jeg ikke...
------------------------------------------------------------------------
Set regEx1 = New RegExp
  Set regEx2 = New RegExp
  regEx1.Pattern = \"([\\+|\\?|\\\'|\\{|\\}|\\.|\\(|\\)|\\,|\\*|\\^|\\$|\\[|\\]|\\\\])\"
  regEx1.Global = True               
  regEx2.IgnoreCase = True
  regEx2.Global = True   
  myTag = regEx1.Replace(myTag, \"\\$1\") \'erstat speciele tegn med deres escape-tegn   
  regEx2.Pattern = \"\\x3c\" & myTag & \"[^\\x3e]*\\x3e\"
-------------------------------------------------------------------------
Avatar billede stringbuffer Nybegynder
09. november 2000 - 13:47 #32
en RegExp (regular expression) er en måde at søge efter et bestemt mønster i en tekststreng.
den første regExp finder alle (global) steder i strengen, hvor der findes et \"specielt\" tegn (f.eks. punktum eller parantes, disse tegn har nemlig bestemte funktioner i regulære udtryk), og replace-udtrykket erstatter så de tegn med deres escape-tegn (dvs sætter backslash foran tegnet, så bliver de et tegn og ikke del af mønsterdefinition i det nye regExp).
den anden regExp er så det mønster, din tag måtte indeholde, f.eks. hvis det er en <?xml> eller <?xml property=\"value\"> så vil regEx2 se således ud:
\\x3c\\?xml[^\\x3e]*\\x3e eller <\\?xml[^>]*>
udtrykker angiver at den vil søge efter et mønster, der starter med < indeholder ?xml evt efterfulgt af nogle tegn der er forskellige fra > (dette angives af [^>]* og endelig slutter med >
\\x3c er blot et escape-tegn for < og tilsvarende med \\x3e og > - jeg bruger dem for at det er tydeligt at der er tale om et tegn og ikke en operator eller andet...
endelig betyder IgnoreCase at det er ligegyldigt om du har angivet ?xml eller ?XML eller hvad du ellers har lyst til at fjerne...

Håber det hjalp lidt, men hvis du vil vide mere om regExp så læs VBScript eller JScript dokumentationen, du har den garanteret på din computer som en VBScript5.chm eller lignende...
og slå op under regular expressions
Avatar billede stringbuffer Nybegynder
09. november 2000 - 13:51 #33
hvis du ikke har disse filer kan jeg sende dem til dig hvis du er interesseret... men hvis du har en PWS eller IIS installeret så er de garanteret på din disk - og det er lidt hurtigere end at sidde og bladre på www.activeserverpages.dk ;-)
Avatar billede roadrunr Nybegynder
09. november 2000 - 14:29 #34
Jamen - så forstår jeg det meget bedre. Jeg skulle nemlig lige have opdateret min VBdoc.
Jeg vil lige kigge videre på det, og så vende tilbage med nogle point. :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester