10. oktober 2000 - 09:22Der 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.
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
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
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.
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>
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.
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\")
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?
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
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!
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.
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\", \"\")
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 ---------------------------------------------------------------
<% 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>
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\" -------------------------------------------------------------------------
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
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 ;-)
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. :)
Synes godt om
Ny brugerNybegynder
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.